Mittleren Punkt eines Dreieks berechen
Übersicht

![]() |
tedyBetreff: Mittleren Punkt eines Dreieks berechen |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 : 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke für den Code
Ohne das hätte ich es nicht geschafft und es klappt auch alles wie es soll Danke ![]() 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: |
||
01010100 01100101 01000100 01111001 00100000 00111010 01000100 |
Kruemelator |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
https://www.blitzforum.de/showcase/166/ | ||
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080 |
![]() |
Triton |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ahh hier schreiben ja noch welche ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group