Aplet rysujacy trojkat z trzech klikniec i liczacy jego pole

0

Mam problem z jeszcze jednym apletem. Zasadniczo dziala, ale mam dwa zastrzezenia. Po 1 kliknieciu powstaje odcinek od punktu (0,0) do klikniecia, po 2 juz widac trojkat, a po 3 znikaja dwa "falszywe" boki i dopiero jest widoczny wlasciwy trojkat. Co do tego mam pytanie: co nalezy poprawic zeby aplet zaczynal cokolwiek rysowac dopiero po 2 kliknieciu?
Druga sprawa: pole jest wyswietlane w jak sadze pikselach. Czy jest jakas mozliwosc zamiany tego na centymetry?
A oto moj aplecik:

package pl.wsb.students.pk;

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Label;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class Pole_trojkata extends Applet implements MouseListener {

    static int pole = 0;

    int n = 3;

    int i = 0;

    int a, b, c, p;

    int[] x = new int[3];

    int[] y = new int[3];

    Label wyswietlacz = new Label("" + pole + ".", Label.CENTER);

    public void init() {
        add(wyswietlacz);
        addMouseListener(this);
    }

    public void mouseClicked(MouseEvent ev) {
        if (i < n) {
            x[i] = ev.getX();
            y[i] = ev.getY();
            i++;
            repaint();
        }
        a = (int) Math.sqrt((x[1] - x[0]) * (x[1] - x[0]) + (y[1] - y[0])
                * (y[1] - y[0]));
        b = (int) Math.sqrt((x[2] - x[1]) * (x[2] - x[1]) + (y[2] - y[1])
                * (y[2] - y[1]));
        c = (int) Math.sqrt((x[0] - x[2]) * (x[0] - x[0]) + (y[0] - y[2])
                * (y[0] - y[2]));
        p = (a + b + c) / 2;
        pole = (int) Math.sqrt(p * (p - a) * (p - b) * (p - c));
        wyswietlacz.setText("" + pole + ".");
    }

    public void paint(Graphics g) {
        g.drawPolygon(x, y, n);

    }

    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub

    }

}

Z gory dzieki za pomoc.

0

Nie chce mi się myśleć wieczorem, ale może to:

if (i < n) {
                        x[i] = ev.getX();
                        y[i] = ev.getY();
                        i++;
                        repaint();
                }

zmienić na takie coś:

if (i < n) {
                        x[i] = ev.getX();
                        y[i] = ev.getY();
                        i++;
                        if(i>1)repaint();
                }

Pisane z palca, do tego jestem po ognisku, więc nie odpowiadam za działanie.
Pozdrawiam

0

zmien metode paint na taką

public void paint(Graphics g) {
            if(i%3==0){
                g.drawPolygon(x, y, n);
                i=0;}

        }

pzdr.

0

Zamiast dodawać punkty i rysować linie użyj klasy java.awt.Polygon ma ona metody addPoint(int x, int y).
Natępnie mozesz w paint użyć metody drawPolygon(Polygon p) klasy Graphic.
Czyli kod wygląda mniej więcej tak:

// pole klasy
static Polygon figura = new Polygon();

//w mouseClicked
  if (i < n) {
                        figura.appdPoint(ev.getX(),ev.getY());
                        i++;
                        if(i!=1)  // po co rysować punkt?
                            repaint();
                }
//w paint()
g.drawPolygon(figura);

Za każdym razem poza pierwszym kliknięciem jet rysowany polygon i sam mechnizm rysujący zapewinia brak "mrugania".

0

jak ty chcesz to przeliczyć na centymetry, przecież ilośc pikseli na centrymetr nie jest stała - zależy od rozdzielczości, plamki monitora.

0

@Krzysiobal, na monitorze i tak będzie to rzecz umowna. Jednak się da :) Jest taki śmieszny ogólny wzór za który dzienkujemy brytyjskiemu systemowi miar: 1cm = dpi/2.54 dotyczy druku, ale można go zastosować i w przeliczniu pikseli.
Jednak można też przyjąć jeszcze prostszy system w którym średnio 1px ~ 0.26mm.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0