Wielokąt o wierzchołkach we wskazanych myszą punktach

0

Witam.
Jak napisać procedurę rysowania wieloboku na Canvasie PaintBox'a o wierzchołkach w punktach wskazanych myszą.
Próbowałem korzystać z funkcji GetCursorPos, ale kompletnie nie mogę ogarnąć jak jej użyć. Proszę o pomoc

0

Skorzystaj ze zdarzenia MouseDown i poczytaj co kol wiek o rysowaniu.

0

Jak napisać procedurę rysowania wieloboku na Canvasie PaintBox'a o wierzchołkach w punktach wskazanych myszą.

To brzmi tak, jakbyś nie umiał w ogóle napisać żadnej procedury;

Przeglądając zdarzenia, jakie oferuje kontrolka (a szczególnie te, które dotyczą myszy) widać jak na dłoni zdarzenia: OnMouseDown, OnMouseUp i OnMouseMove - chyba nie trzeba tłumaczyć ich przeznaczenia; Skoro Ciebie interesuje pobranie współrzędnych myszy podczas kliknięcia (a raczej wciśnięcia przycisku myszy) powinieneś zainteresować się przede wszystkim zdarzeniem OnMouseDown:

MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

i jak widzisz posiada takie argumenty jak Button, z którego odczytać można typ przycisku, a także X i Y, które są współrzędnymi kursora kontrolki (nie myslić ze współrzędnymi kursora na ekranie);

I teraz mając współrzędne w ww. zdarzeniu należy je wpisać np. do przygotowanej tablicy, np.: TPointsArr: array of TPoint i po skończeniu wyznaczania punktów wywołać metodę Polygon, ewentualnie uprzednio ustawiając kolory pędzla;

Próbowałem korzystać z funkcji GetCursorPos, ale kompletnie nie mogę ogarnąć jak jej użyć.

Procedura ta zwraca przez referencję współrzędne kursora na ekranie, więc aby ją wykorzystać musiałbyś przetłomaczyć te współrzędne na te dotyczące formularza, a potem jeszcze dodać pozycję kontrolki po to, by jej lewy górny róg miał współrzędne [0, 0];

Nie ma sensu kombinować, skoro w zdarzeniu OnMouseDown masz wszystko podane jak na tacy, a przy okazji od razu przetłumaczone;

0

Ja właśnie kompletnie nie ogarniam delphi, a muszę napisać program na zaliczenie.
Nie mam pojęcia jak określić rozmiar tablicy dynamicznej wierzcholki:array of TPoint i jakiej funkcji użyć, żeby przy kolejnych kliknięciach myszką zapisywało w tablicy współrzędne piksela, których potrzebuję do funkcji polygon.

0

Nie mam pojęcia jak określić rozmiar tablicy dynamicznej

Zgaduję, że SetLength? :|
Zapraszamy do nauki.

0

Że SetLength, to wiem... chodziło mi o to jak określić liczbę kliknięć myszką w PaintBox

 
procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  wierzcholki:array of TPoint;
  i:integer;
begin
SetLength(wierzch`code>I TU NIE WIEM CO WPISAĆ`);
for i:`code> TU TEŻ LICZBA KLIKNIĘĆ` do
  begin
    wierzcholki[i].X:=X;
    wierzcholki[i].Y:=Y;
  end;

for i:=0 to high(wierzcholki) do
  begin
    Form1.PaintBox1.Canvas.Pixels[wierzcholki[i].X,wierzcholki[i].Y]:=clRed;
  end;

end; 
0
  1. Tablica wierzchołki powinna być w klasie nie w metodzie;
  2. W metodzie zwiększasz rozmiar tablicy o jeden element;
  3. Wpisujesz Y i X do jednego elementu a nie do kilku w pętle;
  4. Do rysowania użyj MoveTo, LineTo lub PolyLine.
0
  1. Do rysowania użyj MoveTo, LineTo lub PolyLine.

A to czemu nie Polygon? W tym wątku negowałeś mnie za wykorzystanie PolyLine podczas rysowania wielokąta na podstawie macierzy punktów, a teraz nagle zmieniłeś zdanie i proponujesz ręcznie dziubać w pętli punkty? Po co?

Poza tym tak, jak napisałem w tamtym temacie jeśli chce się narysować wielokąt na podstawie tablicy współrzędnych należy zdublować pierwszy punkt, bo figura nie zostanie domknięta; Więc lepiej jest wywołać raz metodę Polygon, niż wiele razy w pętli rysować poszczególne jego krawędzie; Dokładanie sobie roboty nie jest w tym momencie wskazane;

Dla tych co nie zrozumieli - powyższe pogrubione zdanie dotyczy metody Polyline a nie Polygon, więc należy zdublować pierwszy punkt, aby utworzyć zamkniętą łamaną bez wypełnienia;

0
_13th_Dragon napisał(a)

Polygon jeżeli wewnątrz musimy zamalować jakimś kolorem czy PolyLine lub MoveTo+LineTo[+LineTo] jeżeli nie trzeba zamalowywać - nie rozumiem z czym masz problem.

Ja nie mam żadnego problemu, tylko w tamtym wątku co do PolyLine napisałeś tak:

_13th_Dragon napisał(a)
Furious Programming napisał(a)

Zauważ, że metoda Polyline potrzebuje o jeden punkt więcej, który będzie miał takie same współrzędne jak pierwszy, bo nie zamyka całości
To jakiś bezsens. Jak chcesz mieć poligon bez wypełnionego środka to robisz.
Pen.Color := clBlack;
Brush.Style := bsClear;
Polygon(POLY_POINTS);
Nie rozumiem po kiego dodawać dodatkowy punkt aby za pomocą PolyLine zasymilować działanie Polygon.
To tak jak by proponować: exp(ln(x)+ln(x)) zamiast x*x - owszem działa tak samo i daje te same wyniki.

Stąd dziwi mnie zmiana Twojego zdania;

A jaśli o metody Polygon i PolyLine chodzi, to taki kod:

procedure TForm1.PaintBox1Click(Sender: TObject);
const
  POINTS_ARR: array [0 .. 3] of TPoint = ((X: 10; Y: 10),
                                          (X: 10; Y: 90),
                                          (X: 90; Y: 90),
                                          (X: 90; Y: 10));
begin
  with PaintBox1.Canvas do
  begin
    Pen.Color := clBlue;
    Brush.Color := clWhite;  //to w sumie jest niepotrzebne przy malowaniu jedynie krawędzi

    PolyLine(POINTS_ARR);
  end;
end;

spowoduje namalowanie takiego czegoś:

PolyLine.png

zaś z metodą Polygon:

procedure TForm1.PaintBox1Click(Sender: TObject);
const
  POINTS_ARR: array [0 .. 3] of TPoint = ((X: 10; Y: 10),
                                          (X: 10; Y: 90),
                                          (X: 90; Y: 90),
                                          (X: 90; Y: 10));
begin
  with PaintBox1.Canvas do
  begin
    Pen.Color := clBlue;
    Brush.Color := clWhite;

    Polygon(POINTS_ARR);
  end;
end;

takiej figury:

Polygon.png

A jeśli chcemy wykorzystać metodę Polygon do rysowania samych krawędzi figury bez wypełnienia - wystarczy ustawić styl wypełnienia:

procedure TForm1.PaintBox1Click(Sender: TObject);
const
  POINTS_ARR: array [0 .. 3] of TPoint = ((X: 10; Y: 10),
                                          (X: 10; Y: 90),
                                          (X: 90; Y: 90),
                                          (X: 90; Y: 10));
begin
  with PaintBox1.Canvas do
  begin
    Pen.Color := clBlue;
    Brush.Style := bsClear;

    Polygon(POINTS_ARR);
  end;
end;

dzięki czemu powstanie takie coś:

ClearPolygon.png

Cały czas o to mi chodzi;

1

Rysowanie najlepiej zrobić następująco:
MoveTo ostatni punkt.
Kolor mazaka - szary (domniemana linia zamykająca)
LineTo pierwszy punkt
Kolor mazaka - niebieski (normalna linia)
w pętle od 2-go do przedostatniego LineTo i-ty punkt
Kolor mazaka - czerwony (ostatnia linia)
LineTo ostatni punkt

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