Mittleren Punkt eines Dreieks berechen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

tedy

Betreff: Mittleren Punkt eines Dreieks berechen

BeitragFr, Jan 02, 2009 22:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wusste nicht wie ich den Thread nennen sollte und hab versucht mich so nah wie möglich an mein Problem anzunähern

Also Ich habe einen Punkt und ein Dreieck :
user posted image

Alle Kordinaten der Punkte sind bekannt. Ich möchte jetzt nur noch wissen welcher Punkt der mitlere Punkt vom Dreieck ist,also der der im grunde genommen in der Mitte liegtm

Hat jemand eine Idee wie man das berechen könnte ?
01010100 01100101 01000100 01111001 00100000 00111010 01000100

Noobody

BeitragFr, Jan 02, 2009 22:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit ein wenig Vektorgeometrie geht das relativ flott:

Code: [AUSKLAPPEN]
Graphics 800, 600, 0, 2
SetBuffer BackBuffer()

Type TPoint
   Field X
   Field Y
End Type

Timer = CreateTimer( 60 )

P1.TPoint = New TPoint : P1\X = 100 : P1\Y = 200
P2.TPoint = New TPoint : P2\X = 300 : P2\Y = 100
P3.TPoint = New TPoint : P3\X = 150 : P3\Y = 250
P4.TPoint = New TPoint

While Not KeyHit( 1 )
   Cls
   
   Color 255, 255, 255
   Line P1\X, P1\Y, P2\X, P2\Y
   Line P2\X, P2\Y, P3\X, P3\Y
   Line P3\X, P3\Y, P1\X, P1\Y
   
   P4\X = MouseX()
   P4\Y = MouseY()
   
   Point.TPoint = CalculateTriMidPoint( P1, P2, P3, P4 )
   
   Color 255, 0, 0
   Rect Point\X, Point\Y, 4, 4
   
   Flip 0
   WaitTimer Timer
Wend
End

Function CalculateTriMidPoint.TPoint( P1.TPoint, P2.TPoint, P3.TPoint, P4.TPoint )
   CenterX# = ( P1\X + P2\X + P3\X )/3.
   CenterY# = ( P1\Y + P2\Y + P3\Y )/3.
   
   VY# = CenterX# - P4\X
   VX# = -( CenterY# - P4\Y )
   
   D# = Dotproduct( P4\X, P4\Y, VX#, VY# )
   D1# = Dotproduct( P1\X, P1\Y, VX#, VY# )
   D2# = Dotproduct( P2\X, P2\Y, VX#, VY# )
   D3# = Dotproduct( P3\X, P3\Y, VX#, VY# )
   
   Diff1# = Abs( D1# - D# )
   Diff2# = Abs( D2# - D# )
   Diff3# = Abs( D3# - D# )
   
   If Diff1# < Diff2# And Diff1# < Diff3# Then Return P1
   If Diff2# < Diff1# And Diff2# < Diff3# Then Return P2
   If Diff3# < Diff1# And Diff3# < Diff2# Then Return P3
End Function

Function Dotproduct#( X1#, Y1#, X2#, Y2# )
   Return X1#*X2# + Y1#*Y2#
End Function
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

tedy

BeitragFr, Jan 02, 2009 22:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für den Code
Ohne das hätte ich es nicht geschafft
und es klappt auch alles wie es soll

Danke Very Happy

Edit:

ZU früh gefreut :/
Ich habe es jetzt mal angewand und ein bischen getestet es klappt auch soweit aber wenn der einzelne Punkt einem des Dreieckes zu nahe kommt ist es nicht mehr richtig.
Bild:
user posted image
01010100 01100101 01000100 01111001 00100000 00111010 01000100
 

Kruemelator

BeitragFr, Feb 13, 2009 22:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weis nicht ob ich es richtig verstanden habe, aber wenn, dann habe ich, glaube ich, eine Lösung für das Problem:

Mal angenommen man sei der Ausgangspunkt und schaut in Richtung Dreieck. Dann sieht man die drei Eckpunkte des Dreiecks nebeneinander.(außer sie sind reinzufällig so angeordnet, dass einer hinter einem anderen ist)
Der gesuchte Punkt ist dann doch der, der in der Mitte wäre, egal wie weit er vom Ausgangspunkt weg ist, oder?

Wenn das oben beschreiben stimmt, dann dürfte der folgende Code eigendlich gehen, habe ihn aber nicht getestet.



Code: [AUSKLAPPEN]
Function mittigerpunkt(ausgangspunktey,ausgangspunktex,punkte1y,punkte2y,punkte3y,punkte1x,punkte2x,punkte3x)
Local winkel1#
Local winkel2#
Local winkel3#
Local y1# = (ausgangspunktey) - punkte1y)
Local x1# = (ausgangspunktex) - punkte1x)

Local y2# = (ausgangspunktey) - punkte2y)
Local x2# = (ausgangspunktex) - punkte2x)

Local y3# = (ausgangspunktey) - punkte3y)
Local x3# = (ausgangspunktex) - punkte3x)

winkel1# = ATan2(y1#,x1#)
winkel1# = winkel1# * -1
If winkel1# < 0 Then
   winkel1# = 180 + (180 + winkel1#)
EndIf

winkel2# = ATan2(y2#,x2#)
winkel2# = winkel2# * -1
If winkel2# < 0 Then
   winkel2# = 180 + (180 + winkel2#)
EndIf

winkel3# = ATan2(y3#,x3#)
winkel3# = winkel3# * -1
If winkel3# < 0 Then
   winkel3# = 180 + (180 + winkel3#)
EndIf




If winkel1# >= winkel2# Then
   If winkel2# >= winkel3# Then
      winkel# = winkel3#
      winkelpunkt = 3
   Else
      winkel# = winkel2#
      winkelpunkt = 2
   EndIf
Else
   If winkel1# >= winkel3# Then
      winkel# = winkel3#
      winkelpunkt = 3
   Else
      winkel# = winkel1#
      winkelpunkt = 1
   EndIf
EndIf

winkel1# = winkel1# - winkel#
winkel2# = winkel2# - winkel#
winkel3# = winkel3# - winkel#

Select    winkelpunkt
Case 1
If winkel2# >= winkel3# Then
   suchpunkt = 3
Else
   suchpunkt = 2
EndIf

Case 2
If winkel1# >= winkel3# Then
   suchpunkt = 3
Else
   suchpunkt = 1
EndIf

Case 3
If winkel2# >= winkel1# Then
   suchpunkt = 1
Else
   suchpunkt = 2
EndIf
End Select

Return suchpunkt
End Function


Zum Prinzip:
- Es wird der Ausgangspunkt genommen und die Gradzahl der drei Punkte des Dreiecks ermittelt. Direkt über dem Ausgangspunkt wäre es 0°/360°, direkt rechts daneben 90°.....
Die Entferung zum Ausgangspunkt ist dabei irrelevant.
- Es wird der kleinste WInkel ermittel und von den anderen abgezogen, so hat man zwei, meist unterschiedlich große, Winkel.
- Der kleinere ist der der in der Mitte liegt

Gruß Kruemelator

SpionAtom

BeitragSa, Feb 14, 2009 0:24
Antworten mit Zitat
Benutzer-Profile anzeigen
https://www.blitzforum.de/showcase/166/
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Triton

BeitragSo, Feb 15, 2009 17:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Jeder der 4 Punkte hat 3 Verbindungen zu den anderen Punkten, die eine bestimmte Länge haben.
Der Punkt in der Mitte sollte, wenn man alle Längen addiert, die kleinste Summe haben.

Programm:
Code: [AUSKLAPPEN]

;*** Welcher von 4 Punkten liegt in der Mitte?
;*** 15.02.2009 by Triton
Graphics 1024,768,32,1
SeedRnd MilliSecs()
Color 255,255,255
Dim ko(2,3)      ;x,y,summe


For ofty= 0 To 3
   x = Rand(0,1023)
   y = Rand(0,767)
   ko(0,ofty) = x
   ko(1,ofty) = y
   
   If ofty=0 Then txt$="A"
   If ofty=1 Then txt$="B"
   If ofty=2 Then txt$="C"
   If ofty=3 Then txt$="D"
   Oval x-3,y-3,6,6
   Text x-5,y+3,txt$
Next


ab=(ko(0,1)-ko(0,0))^2+(ko(1,1)-ko(0,1))
ac=(ko(0,2)-ko(0,0))^2+(ko(1,2)-ko(0,1))
ad=(ko(0,3)-ko(0,0))^2+(ko(1,3)-ko(0,1))
a=ab+ac+ad

bc=(ko(0,2)-ko(0,1))^2+(ko(1,2)-ko(1,1))
bd=(ko(0,3)-ko(0,1))^2+(ko(1,3)-ko(1,1))
b=ab+bc+bd

cd=(ko(0,3)-ko(0,2))^2+(ko(1,3)-ko(1,2))
c=ac+bc+cd

d=ad+bd+cd

Print Str("A: "+a+", B: "+b+", C: "+c+", D: "+d )

WaitKey
End



Der Punkt mit dem kleinsten Zahlenwert hat den geringsten Abstand zu
den anderen Punkten und liegt daher in der "Mitte".
Habs nicht ausführlich getestet, aber ich meine, es sollte stimmen.

Es ist natürlich noch nicht eindeutig - das ursprungsdreieck besteht
immer aus verschiedenen Punkten und nicht immer a,b,c
Coding: silizium-net.de | Portfolio: Triton.ch.vu

tedy

BeitragSo, Feb 15, 2009 18:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ahh hier schreiben ja noch welche Very Happy

Naja hatte das Problem anders gelöst
Aber Triton...
Dier punkt mit dem kleinsten abstand zum punkt 4 ist nicht richtig da es auch der randpunkt sien kann wenn man nah genug dran ist
(es sind belibige dreiecke)
01010100 01100101 01000100 01111001 00100000 00111010 01000100

Triton

BeitragSo, Feb 15, 2009 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, wie gesagt, es ist nicht eindeutig. Das Dreieck an sich ergibt sich erst durch das Ausschlussverfahren der Punkte.
Coding: silizium-net.de | Portfolio: Triton.ch.vu
 

Darren

BeitragDo, Feb 19, 2009 10:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Wo ist hier eigentlich genau das Problem? wollt ihr jetzt den Schwerpunkt des dreieckes? einen Punkt der iwo auf der Seitenhalbierenden liegt oder wie seh ich das? was soll das überhaupt da oben für ne skizze sein? paar punkte hingemalt mit mehr oder weniger eindeutiger abhängigkeit... was soll man da helfen? versteh ich nich
MFG Darren

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group