AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Dreieck um Punkt auf der Hypotenuse drehen

Dreieck um Punkt auf der Hypotenuse drehen

Ein Thema von w4rheart · begonnen am 16. Mär 2010 · letzter Beitrag vom 24. Mär 2010
Antwort Antwort
Seite 3 von 3     123
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#21

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 17. Mär 2010, 16:03
Zitat von Medium:
Doch, können sie.
Das glaube ich erst, wenn ich es sehe, denn:

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 von Medium:
(...)via Multiplikation, nicht Addition
Mensch, das war ein Beispiel, in dem man Operationen "zusammenfassen" kann.
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#22

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 17. Mär 2010, 16:11
Zitat von Panthrax:
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 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}
Miniaturansicht angehängter Grafiken
codecogseqn_181.png  
  Mit Zitat antworten Zitat
w4rheart

Registriert seit: 16. Mär 2010
53 Beiträge
 
#23

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 17. Mär 2010, 18:09
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...
Angehängte Dateien
Dateityp: zip dreiecksrotation_189.zip (210,7 KB, 11x aufgerufen)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#24

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 17. Mär 2010, 18:24
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'
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
w4rheart

Registriert seit: 16. Mär 2010
53 Beiträge
 
#25

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 17. Mär 2010, 22:26
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?

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 =)
  Mit Zitat antworten Zitat
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#26

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 18. Mär 2010, 16:51
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 von Medium:
Zitat von Panthrax:
Zitat von Medium:
Zitat von Panthrax:
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.
Miniaturansicht angehängter Grafiken
matrix-_vs._direktberechnung_325.png  
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#27

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 18. Mär 2010, 18:22
Macht der Gewohnheit, ich denke nur in homogenen Koordinaten . 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
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
w4rheart

Registriert seit: 16. Mär 2010
53 Beiträge
 
#28

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 23. Mär 2010, 18:48
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
  Mit Zitat antworten Zitat
w4rheart

Registriert seit: 16. Mär 2010
53 Beiträge
 
#29

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 24. Mär 2010, 23:09
bump

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

EDIT: hat sich erledigt^^ das von panthrax hat geholfen =)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:46 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