Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Drei Werte als Punkt im Dreieck darstellen (https://www.delphipraxis.net/170763-drei-werte-als-punkt-im-dreieck-darstellen.html)

xaromz 2. Okt 2012 09:39

Drei Werte als Punkt im Dreieck darstellen
 
Hallo,

ich habe hier drei Werte, die ich in einem Diagramm darstellen will. Die drei Werte haben jeweils einen Bereich von 0 bis 1.

Mein Plan ist, diese Werte in einem gleichschenkligen Dreieck darzustellen. Wenn z. B. alle drei Werte gleich sind, soll ein Punkt in der Mitte des Dreiecks gezeichnet werden, wenn zwei Werte null sind, soll ein Punkt an einer Spitze des Dreiecks gezeichnet werden. Sind zwei Werte gleich groß und der dritte null, dann muss der Punkt in der Mitte eines Schenkels gezeichnet werden. Ansonsten soll der Punkt relativ zu den Eckpunkten in der Dreiecksfläche positioniert sein.

Da gibt's doch sicher eine Formel für?

Gruß
xaromz

Lemmy 2. Okt 2012 09:52

AW: Drei Werte als Punkt im Dreieck darstellen
 
Sicher.. nennt sich Dreisatz...

Der Nullpunkt ist die Mitte des Dreiecks, 1 befindet sich an den jeweiligen Dreiecks-Eckpunkten. Die Position des entsprechenden Wertes kannst Du dann auf der Linie zwischen Mittelpunkt und Eckpunkt reininterpolieren...

Grüße

xaromz 2. Okt 2012 10:06

AW: Drei Werte als Punkt im Dreieck darstellen
 
Hallo,

nicht so ganz. Ich will ja nicht drei Punkte ins Dreieck malen, sondern nur einen. Die drei Werte sind quasi die x,y,z Koordinaten des Punktes.
Vielleicht lässt es sich besser so erklären: Die drei Werte ziehen den Punkt jeweils in Richtung ihrer Ecke. Dabei sind die Werte relativ zueinander zu betrachten.

Gruß
xaromz

Lemmy 2. Okt 2012 10:19

AW: Drei Werte als Punkt im Dreieck darstellen
 
Hallo,

ah OK, das habe ich überlesen, dass es nur ein Punkt sein soll. d.h. du brauchst den Schwerpunkt des Dreiecks mit unterschiedlich gewichteten Eckpunkten - da muss ich passen. Mit etwas Zeit könnte ich da aber sicherlich was zusammenbasteln....

so jetzt...

den Schwerpunkt rechnest Du mit

Code:
xS = (xA + xB + xC)/3
yS = (yA + yB + yC)/3 
Quelle und Herleitung: http://www.arndt-bruenner.de/mathe/geometrie/schwerpunktdreieck.htm
aus diesem Mittel machst Du jetzt ein gewichtetes mittel... wenn mich nicht alles täuscht:


Code:
xS = ((nA*xA)/(nA+nB+nC) + (nB*xB)/(nA+nB+nC) + (nC*xC)/(nA+nB+nC))/(3)
yS = ((nA*yA)/(nA+nB+nC) + (nB*yB)/(nA+nB+nC) + (nC*yC)/(nA+nB+nC))/(3)
wobei nA..nC deine drei Werte von 0..1 sind.

Uwe Raabe 2. Okt 2012 10:55

AW: Drei Werte als Punkt im Dreieck darstellen
 
Zitat:

Zitat von xaromz (Beitrag 1185367)
ich habe hier drei Werte, die ich in einem Diagramm darstellen will. Die drei Werte haben jeweils einen Bereich von 0 bis 1.

Mein Plan ist, diese Werte in einem gleichschenkligen Dreieck darzustellen. Wenn z. B. alle drei Werte gleich sind, soll ein Punkt in der Mitte des Dreiecks gezeichnet werden, wenn zwei Werte null sind, soll ein Punkt an einer Spitze des Dreiecks gezeichnet werden. Sind zwei Werte gleich groß und der dritte null, dann muss der Punkt in der Mitte eines Schenkels gezeichnet werden. Ansonsten soll der Punkt relativ zu den Eckpunkten in der Dreiecksfläche positioniert sein.

Diese Angaben bestimmen den Punkt nur für die Fälle in denen ein oder zwei Werte 0 sind bzw. zwei oder drei Werte gleich sind, sagen aber nichts über die relative Position bei anderen Werten aus.

Kannst du noch etwas über die Werte selbst sagen? Du erwähnst, daß es sich dabei um x,y,z-Koordinaten im Bereich 0..1 handelt. Ist das zufällig ein Richtungsvektor, bei dem immer
Delphi-Quellcode:
x² + y² + z² = 1
ist?

xaromz 2. Okt 2012 11:18

AW: Drei Werte als Punkt im Dreieck darstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Uwe,

die drei Werte sind eigentlich willkürlich, werden aber in der Bereich transformiert (die Originaldaten sind IMHO im Bereich 0..3 und stellen Kompetenzwerte dar). Die Werte selbst haben erstmal keinerlei Bezug zueinander (sind also auch keine Koordinaten), sollen aber in Bezug gebracht werden.
Ich hab mal ein Beispiel angehängt (die Position stimmt natürlich nicht).

Gruß
xaromz

Lemmy 2. Okt 2012 11:54

AW: Drei Werte als Punkt im Dreieck darstellen
 
so, habe oben die Gleichung für das gew. Mittel nochmal korrigiert. Damit konnte ich plausible Werte ermitteln.

Grüße

xaromz 2. Okt 2012 12:35

AW: Drei Werte als Punkt im Dreieck darstellen
 
Hallo,

danke. Ich habe die Formel noch etwas angepasst, jetzt spuckt sie die richtigen Werte aus.

Gruß
xaromz

Bummi 2. Okt 2012 12:36

AW: Drei Werte als Punkt im Dreieck darstellen
 
@Lemmy
die Division / 3 ist zuviel .....

Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);
Type
 TParry=Array [0..3] of Tpoint;
 TCMP=Array[0..2] of Double;
var
  p,hp:TParry;
  CMP:TCMP;
  zp:Tpoint;
begin
   p[0].x := 0;
   p[0].y := 0;
   p[1].x := 300;
   p[1].y := 0;
   p[2].x := (p[1].x - p[0].x) div 2;
   p[2].y := Round(Sin(DegToRad(60))*(p[1].x - p[0].x) +  p[0].x );
   p[3] := p[0];

   CMP[0] := 0.5;
   CMP[1] := 0.5;
   CMP[2] := 0.9;
{
   CMP[0] := 0.5;
   CMP[1] := 0.5;
   CMP[2] := 0.5;
}
   Assert(CMP[0]+ CMP[1]+ CMP[2] <> 0);
   zp.x := Round(((CMP[0]*p[0].x)/( CMP[0]+ CMP[1]+ CMP[2]) + (CMP[1]*p[1].x)/( CMP[0]+ CMP[1]+ CMP[2]) +  (CMP[2]*p[2].x)/( CMP[0]+ CMP[1]+ CMP[2])));
   zp.y := Round(((CMP[0]*p[0].y)/( CMP[0]+ CMP[1]+ CMP[2]) + (CMP[1]*p[1].y)/( CMP[0]+ CMP[1]+ CMP[2]) +  (CMP[2]*p[2].y)/( CMP[0]+ CMP[1]+ CMP[2])));

   Image1.Canvas.Polyline(p);
   image1.Canvas.Ellipse(zp.x-2,zp.y-2,zp.x+2,zp.y+2);

end;

Uwe Raabe 2. Okt 2012 13:00

AW: Drei Werte als Punkt im Dreieck darstellen
 
Um es mal wieder auf die reine Berechnung des Punktes zu beschränken, da ich über die Zeichenfläche ja nichts weiß:

Delphi-Quellcode:
procedure CalcPoint(A, B, C: Double; var X, Y: Double);

  es gilt: -0.5 <= X <= 0.5 und 0 <= Y <= 1
  X=0, Y=0 entspricht dem Mittelpunkt der unteren Linie des Dreiecks
  und bedeutet (A = 0) und (B = C)
}
begin
  Assert((A >= 0) and (B >= 0) and (C >= 0));
  if IsZero(B + C) then
    X := 0
  else
    X := C/(B + C) - 0.5; // Verhältnis C:B
  if IsZero(A + B + C) then
    Y := 0.5
  else
    Y := A/(A + B + C);  // Verhältnis A:(B+C)
  X := X * (1 - Y);
end;
Allerdings ist das auch nur an den Rändern und in der Mitte gemäß den Randbedingungen. Für die Proportionalität dazwischen gibt es unterschiedliche Lösungen.

@Bummi: jemand ohne Kompetenz
Delphi-Quellcode:
(A = B = C = 0)
erzeugt bei deinem Code ein EDivByZero.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:24 Uhr.
Seite 1 von 2  1 2      

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