Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Dreieck um Punkt auf der Hypotenuse drehen (https://www.delphipraxis.net/149201-dreieck-um-punkt-auf-der-hypotenuse-drehen.html)

Panthrax 17. Mär 2010 16:03

Re: Dreieck um Punkt auf der Hypotenuse drehen
 
Zitat:

Zitat von Medium
Doch, können sie.

Das glaube ich erst, wenn ich es sehe, denn:

Zitat:

Zitat von Medium
Die Matrixmultiplikation ist nicht Kommutativ, (...)

Multiplizieren ist kommutativ. Hier wird aber nicht nur multipliziert: Die Operationen können nicht vertauscht werden. (Schieben, Drehen) ist etwas anderes als (Drehen, Schieben). -- Man nehme einen Stift und mache einen Punkt auf einem Blatt Papier. Nun fixiere man das Blatt mit dem Stift an einem zweiten Punkt auf dem Tisch. Das ist die Auslangslage. Nun: (1) Blatt 90° im Uhrzeigersinn drehen, dann 10cm nach Osten schieben. (2) Blatt 10cm nach Osten schieben (unter dem Drehpunkt verschieben), dann 90° im Uhrzeigersinn drehen. Ergebnis, der Punkt endet an unterschiedlichen Positionen.

Zitat:

Zitat von Medium
(...)via Multiplikation, nicht Addition ;)

Mensch, das war ein Beispiel, in dem man Operationen "zusammenfassen" kann. :roll:

jfheins 17. Mär 2010 16:11

Re: Dreieck um Punkt auf der Hypotenuse drehen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Panthrax
Zitat:

Zitat von Medium
Doch, können sie.

Das glaube ich erst, wenn ich es sehe, denn:

Ich hab mich auch gewndert, musste dann aber an Homogene Koordinaten denken, mit denen geht das.
Damit wird im 2-dim. Fall eine 3x3 Matrix benötigt, aber dann kommt man mit nur einer Matrizenmultiplikation aus ;)
Zitat:

Zitat:

Zitat von Medium
Die Matrixmultiplikation ist nicht Kommutativ, (...)

Multiplizieren ist kommutativ.
Bei reellen Zahlen ja, aber Matrizenmultiplikation ist nicht kommutativ.

P.S.: Hab das mal kurz duchgerechnet, es kommt das gleiche raus. Die Matrix ist dann wie im Anhang ;)

\begin{pmatrix}x' \\ y' \\ 1 \end{pmatrix}
=
\begin{pmatrix}
cos\ \gamma & -sin\ \gamma & -x_0\ cos\ \gamma+y_0\ sin\ \gamma+x_0\\
sin\ \gamma & cos\ \gamma & -x_0\ sin\ \gamma-y_0\ cos\ \gamma+y_0\\
0 & 0 & 1
\end{pmatrix}
*
\begin{pmatrix}x \\ y \\ 1 \end{pmatrix}

w4rheart 17. Mär 2010 18:09

Re: Dreieck um Punkt auf der Hypotenuse drehen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hello again!
Also dank eurer Hilfe hab ich jetzt soweit das meiste hingekriegt!
Allerdings zeigen sich jetzt bei dem Programm die von euch oben angesprochen Rundungsfehler.
Das ist meine DrehFunktion:
Delphi-Quellcode:
var
  Ax,Bx,Cx,Ay,By,Cy,winkelx:integer;
  Sn,Cs:extended;
begin
  deldreieck; //altes Dreieck löschen
  winkel:=winkel-alpha;

  Cs:= cos(degtorad(alpha));
  Sn:= sin(degtorad(alpha));

  //Neue Punkte errechnen(nachRotation)
  Ax := round(Cs * (A.x-xpos) - Sn * (A.y-ypos));
  Ay := round(Sn * (A.x-xpos) + Cs * (A.y-ypos));
  A:=Point(xpos+Ax,ypos+Ay);

  Bx := round(Cs * (B.x-xpos) - Sn * (B.y-ypos));
  By := round(Sn * (B.x-xpos) + Cs * (B.y-ypos));
  B:=Point(xpos+Bx,ypos+By);

  Cx := round(Cs * (C.x-xpos) - Sn * (C.y-ypos));
  Cy := round(Sn * (C.x-xpos) + Cs * (C.y-ypos));
  C:=Point(xpos+Cx,ypos+Cy);

  Image1.Canvas.Polygon([A,B,C]); // Neues Dreieck Zeichnen
(A,B,C,xpos,ypos sind globale Integer Variablen)

Bei Kleineren Winkeln funktioniert das Ganze nicht! -> Rundungsfehler?
Die Version von Panthrax funktioniert, allerdings habe ich da noch nicht ganz durchgeblickt,
und weiss nicht genau wie ich das auf meien Prozedur oben anwenden soll.

Hab im Anhang nochmal das Programm beifügt.
(Beim löschen des alten Dreiecks gibt es immmernoch Probleme... ist aber erstmal nicht ganz so wichtig)

MfG
w4rheart

//EDIT: Hat sich erledigt. hab jetzt alles mit reals gerechnet und nicht mehr mit integern, jetzt tuts eig. alles (Programm im Anhang).
Bis auf 1. Sache (Das wird aber wahrscheinlch durch das Canva sbedingt nicht lösbar sein, glaub ich):
Wenn ein neues Dreieck gezeichnet wird, muss das alte vorher gelöscht werden. Wenn das Dreieck aber jetzt auf einer linie Mit einem gezeichneten Strich liegt, wird dieser Auch gelöscht, so entsehen Lücken! - Und die will ich weghaben^^
Ist evtl möglich 2 Timage.Canvas übereinander zulegen, und 1 Transparent zu machen? So könnte man auf einem nur die Dreiecke Zeichnen, und auf dem anderen die linien :)
Mh, Probier ich mal aus...

Medium 17. Mär 2010 18:24

Re: Dreieck um Punkt auf der Hypotenuse drehen
 
Zitat:

Zitat von Panthrax
Das glaube ich erst, wenn ich es sehe

Sei A eine Translationsmatrix mit A =
Code:
|x 0 0|
|0 y 0|
|0 0 1|
und B eine Rotationsmatrix mit B =
Code:
|cos -sin 0|
|sin cos 0|
| 0   0   1|
Dann ist X = A*B =
Code:
|x*cos -x*sin 0|
|y*sin y*cos 0|
|  0      0   1|
Und X' = B*A =
Code:
|x*cos -y*sin 0|
|x*sin y*cos 0|
|  0      0   1|
Und offensichtlich ist X != X'

w4rheart 17. Mär 2010 22:26

Re: Dreieck um Punkt auf der Hypotenuse drehen
 
Weiss hier zufälligerweise jemand, wie ich eine Bitmap auf transparent bekomme?

Delphi-Quellcode:
  Image2.canvas.Brush.Style := bsClear;
  Image2.Canvas.FillRect(Rect(0,0,300,300));
  Image2.Transparent := True;
  Image1.Picture.Bitmap.Transparent:=true;
    with Image1.Picture.Bitmap do begin
    TransparentColor := CLWHITE;
    TransparentMode := tmFixed;
    end;
  Image2.Picture.Bitmap.TransparentColor := Image2.Picture.Bitmap.Canvas.Pixels[1,1];
  Image2.picture.Bitmap.TransparentMode:=tmAuto;
  A.x:=xpos-10;
Hat alles nichts genützt!
Hilfe, wie geht das? :-D

MfG

//EDIT: einfahc transparent auf true setzen, bei delphi 5 funktionierts, bei delphi 7 nicht, da wirds weiss, seltsam.
Hab jetzt auf jedenfall alles hingekriegt!
Nochmals vielen Dank an alle für die Hilfe =)

Panthrax 18. Mär 2010 16:51

Re: Dreieck um Punkt auf der Hypotenuse drehen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zur Transparenz: Bei mir funktioniert das wunderbar:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  with Image1 do
  begin
    Canvas.Brush.Color := clBlue;
    Canvas.FillRect(Rect(Point(0,0), Point(Width, Height)));
    Canvas.Brush.Color := clNavy;
    Canvas.FillRect(Rect(Point(20,20), Point(Width-20, Height-20)));
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  with Image1 do
  begin
//    Picture.Bitmap.TransparentColor := clYellow;
    Transparent := True;

    Canvas.Brush.Color := clYellow;
    Canvas.FillRect(Rect(Point(40,40), Point(Width-40, Height-40)));
  end;
end;
In der Delphi-Hilfe steht aber auch: "Anmerkung: Transparent wirkt sich nur dann aus, wenn in der Eigenschaft Picture ein TBitmap-Objekt enthalten ist."

Zum Rundungsproblem: Solange die berechneten Werte die Parameter für die nächste Berechnung sind, werden sich die Rundungsfehler aufaddieren. Mit höherer Genauigkeit wird der Verformungseffekt nur verlangsamt. Warum nicht nur den Winkel ändern und mit den ursprüglichen Werten rechen, die das Dreieck beschreiben?

Zu den Matrizen :
Zitat:

Zitat von Medium
Zitat:

Zitat von Panthrax
Zitat:

Zitat von Medium
Zitat:

Zitat von Panthrax
Zitat:

Zitat von shmia
Man kann das Verschieben, Drehen und Zurückverschieben auch mit einer 2D-Matrix berechnen, (...)

Das geht nicht, (...)

Doch, können sie. (...)

Das glaube ich erst, wenn ich es sehe, (...)

Sei A (...)

Und dann kommt er mich ja doch mit einer 3x3-Matrix... aber ich seh' schon, wir haben uns da missverstanden. Und über die Vertauschbarkeit der Operationen hat ja auch nie jemand etwas anderes behauptet... Am Ende enthalten die Matrizen dieselben Formeln, denn sie enthalten immernoch die Variablen. Mit zunehmender Komplexität der Operationen werden die Berechnungen auch teurer, als bei der schrittweisen Berechnung, da mehr Multiplikationen erzeugt werden. Die schrittweise Berechnung kann man auch nach langer Zeit und ohne Dokumentation wieder intuitiv verstehen. Solange man auf die Matrizen verzichten kann... sollte man das tun.

Medium 18. Mär 2010 18:22

Re: Dreieck um Punkt auf der Hypotenuse drehen
 
Macht der Gewohnheit, ich denke nur in homogenen Koordinaten :oops:. Für 2x2 Matrizen schaut das aber ganz genau so aus, da die 3. Zeile/Spalte auch wieder nur die Identität in der 3. Dimension ist.
Aber wie du schon sagst, ist es meist nicht sinnvoll alle Transformationen zusammenzuziehen, da man letztlich bei mindestens genau so vielen Operationen landet wie bei der schrittweisen Anwendung, und es doch eher selten ist, dass man hunderte Male genau die selbe Transformation ausführt. Aber gehen tut es, in egal wie vielen Dimensionen ;)

w4rheart 23. Mär 2010 18:48

Re: Dreieck um Punkt auf der Hypotenuse drehen
 
Hallo!

Ich melde mich hier nochmal!
Leider immernoch das Problem der Tranzparaenz eines Image, und des dadrauf gezeichneten Canvas.

Ich habe "transparent" des oben liegenden canvas auf "true" gesetzt;
Kurz und Knapp: Auf machen Rechnern wird das Image transparent, auf anderen wiederum nicht!
Ich habe zum teil sogar nicht neu kompiliert, sondern eifnach die exe kopiert:
selbes Ergebnis, auf manchen Rechnern (selbst gleiches Betriebsystem etc.) wird das Image nicht transparent!

Woran kann das liegen? Für mich hört sich das sehr absurd an...
Kann mir jemand weiterhelfen? Gibt es noch weitere Methoden ein Image/Canvas transpartent zu machen?

MfG

w4rheart 24. Mär 2010 23:09

Re: Dreieck um Punkt auf der Hypotenuse drehen
 
bump

Hab noch immer keinen plan warum es nur auf manchen PCs funktioniert...

EDIT: hat sich erledigt^^ das von panthrax hat geholfen =)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:32 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz