Re: Dreieck um Punkt auf der Hypotenuse drehen
Zitat:
Zitat:
Zitat:
|
Re: Dreieck um Punkt auf der Hypotenuse drehen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Damit wird im 2-dim. Fall eine 3x3 Matrix benötigt, aber dann kommt man mit nur einer Matrizenmultiplikation aus ;) Zitat:
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} |
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:
(A,B,C,xpos,ypos sind globale Integer Variablen)
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 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... |
Re: Dreieck um Punkt auf der Hypotenuse drehen
Zitat:
Code:
und B eine Rotationsmatrix mit B =
|x 0 0|
|0 y 0| |0 0 1|
Code:
Dann ist X = A*B =
|cos -sin 0|
|sin cos 0| | 0 0 1|
Code:
Und X' = B*A =
|x*cos -x*sin 0|
|y*sin y*cos 0| | 0 0 1|
Code:
Und offensichtlich ist X != X'
|x*cos -y*sin 0|
|x*sin y*cos 0| | 0 0 1| |
Re: Dreieck um Punkt auf der Hypotenuse drehen
Weiss hier zufälligerweise jemand, wie ich eine Bitmap auf transparent bekomme?
Delphi-Quellcode:
Hat alles nichts genützt!
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; 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 =) |
Re: Dreieck um Punkt auf der Hypotenuse drehen
Liste der Anhänge anzeigen (Anzahl: 1)
Zur Transparenz: Bei mir funktioniert das wunderbar:
Delphi-Quellcode:
In der Delphi-Hilfe steht aber auch: "Anmerkung: Transparent wirkt sich nur dann aus, wenn in der Eigenschaft Picture ein TBitmap-Objekt enthalten ist."
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; 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:
|
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 ;) |
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 |
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 22:57 Uhr. |
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