Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Dreieck skalieren (verkleinern) (https://www.delphipraxis.net/118783-dreieck-skalieren-verkleinern.html)

Neutral General 14. Aug 2008 19:38


Dreieck skalieren (verkleinern)
 
Hi,

Ich habe 3 Punkte gegeben. A,B,C, die ich mit Canvas.MoveTo/LineTo verbinde.
Wie muss man jetzt die Koordinaten anpassen um das Dreieck um x Pixel zu vergrößern/verkleinern.

Hab schon nachgedacht, aber ich scheine irgendwie aufm Schlauch zu stehn.... Oder es ist tatsächlich nicht so einfach.

Gruß
Neutral General

Larsi 14. Aug 2008 19:40

Re: Dreieck skalieren (verkleinern)
 
Also a musst du doch einen nach unten und einen nach links verschieben. b musst du einfach nur einen nach oben verschieben und c einen nach unten und einen nach rechts. Also links = a, Oben 0 b und c = rechts. Also z.B. b - 1;

SirThornberry 14. Aug 2008 19:42

Re: Dreieck skalieren (verkleinern)
 
Ich würde es mit einer Verhältnisgleichung lösen.

Apollonius 14. Aug 2008 19:44

Re: Dreieck skalieren (verkleinern)
 
Ich würde in ein Koordinatensystem transformieren, in dem das Streckzentrum im Ursprung liegt. Dann kannst du alle Koordinaten mit dem Streckfaktor skalieren und zurücktransformieren.

Namenloser 14. Aug 2008 19:47

Re: Dreieck skalieren (verkleinern)
 
Zitat:

Zitat von Larsi
Also a musst du doch einen nach unten und einen nach links verschieben. b musst du einfach nur einen nach oben verschieben und c einen nach unten und einen nach rechts. Also links = a, Oben 0 b und c = rechts. Also z.B. b - 1;

Nein, dadurch verändert sich die Form des Dreiecks.

jfheins 14. Aug 2008 20:06

Re: Dreieck skalieren (verkleinern)
 
Zitat:

Zitat von SirThornberry
Ich würde es mit einer Verhältnisgleichung lösen.

Das geht aber nur, wenn es im Ursprung leigt, ansonsten verschibt es sich ;)

Also (wie Apollonarias gesagt hat) musst du zuerst ein Zentrum finden. Das kann der Schnittpunkt der Seitenhalbierenden sein, der der Winkelhalbierebnden oder so.
Dann (die Punkte liegen hoffentlich in vektoriell vor) von jedem Punkt die Koordinaten des Mitelpunkts abziehen. Dann hast du den Mittelpunkt im Ursprung.
Dann kannst du deine Punkte mit einem beliebigen Faktor skalieren, und auf die neuen Koordinaten wieder die des Mitelpunkts hinzuaddieren.

Wenn es schnell gehen muss, kannst du auch den Mittelwert der drei x-Koordinaten und den Mittelwert deer drei y-Koordinaten als Mittelpunkt nehmen.
Von der Wahl des Mittelpunkts hängt es ab, wie dol es in welche Richtung wächst ;)

omata 14. Aug 2008 22:33

Re: Dreieck skalieren (verkleinern)
 
war wohl doch keine gute Idee...

taaktaak 15. Aug 2008 08:15

Re: Dreieck skalieren (verkleinern)
 
Moin, Moin.

Mir ist unklar, was du mit
Zitat:

um das Dreieck um x Pixel zu vergrößern/verkleinern
meinst!
Soll das Dreieck prozentual vergrößert werden? Sollen die Seitenlinien länger werden? Oder wie ist das gemeint?

Tyrael Y. 15. Aug 2008 09:06

Re: Dreieck skalieren (verkleinern)
 
- Mittelpunkt des Dreiecks bestimmen
- mit dem Faktor der Vergrößerung den neuen Abstand zum Mittelpunkt für jede Ecke bestimmen


Edit: Dieses Verfahren klappt nicht nur für Dreiecke, sondern für alle n-Ecke

Corpsman 15. Aug 2008 09:11

Re: Dreieck skalieren (verkleinern)
 
Also ein Dreieck wird ganz einfach skalliert :
Delphi-Quellcode:

Procedure Scale3eck(var p1,p2,p3:Tpoint;Prozent:Double);
var mx,my:Double;
    dx,dy:Double;
begin
  // erst mal den Mittelpunkt berechnen
  mx := ( p1.x + p2.x +p3.x)/3;
  my := ( p1.y + p2.y +p3.y)/3;
  // Mit Hilfe des Mittelpunktes kann man die Translation in den Ursprung machen
  dx := (p1.x - mx);
  dy := (p1.y - my);
  p1.x := round( dx * Prozent + mx)
  p1.y := round( dy * Prozent + my)

  dx := (p2.x - mx);
  dy := (p2.y - my);
  p2.x := round( dx * Prozent + mx)
  p2.y := round( dy * Prozent + my)

  dx := (p3.x - mx);
  dy := (p3.y - my);
  p3.x := round( dx * Prozent + mx)
  p3.y := round( dy * Prozent + my)

end;
Edit : Ah Tyrael Y. war doch schneller, aber mein Algo macht genau das selbe wie er beschrieben hat.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:26 Uhr.
Seite 1 von 2  1 2      

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