Dreiecksmittelpunkt für Innen und Außenkreis

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

StepTiger

Betreff: Dreiecksmittelpunkt für Innen und Außenkreis

BeitragDi, Okt 03, 2006 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Tjo, dacht mir, ich mach mal wieder einen kleinen Code.

Überlegt, nix eingefallen also mal ins Blitzprog Forum geschaut Smile (unterschwellige Werbung, heh?)

Da gings um Distanzen für einen eventuellen Treffpunkt. Erstmal rein hypotetisch. Und da dacht ich mir, mach ich mal einen Code dafür Smile

Pic dazu gibts hier.

Code gibts hier:
Code: [AUSKLAPPEN]
Graphics 375,499,32,2
SetBuffer BackBuffer()

dt=LoadImage("DT.bmp")

num=0
Global x[2]
Global y[2]
Global rx[2]
Global ry[2]
Global wink[2]
Global inwink[2]
Global inwink1[2]
Global inwink2[2]
Global dist[2]

While Not KeyDown(1)
   
   DrawImage dt,0,0

   r=0

   Color 128,164,255
   For i=0 To 2
      If x[i]>0 And y[i]>0
         Oval x[i]-5,y[i]-5,10,10,1
         r=r+1
      EndIf
   Next

   If r=3
      Line x[0],y[0],x[1],y[1]
      Line x[0],y[0],x[2],y[2]
      Line x[1],y[1],x[2],y[2]
      
      dist[0]=Sqr((x[0]-x[1])^2+(y[0]-y[1])^2)
      dist[1]=Sqr((x[0]-x[2])^2+(y[0]-y[2])^2)
      dist[2]=Sqr((x[1]-x[2])^2+(y[1]-y[2])^2)
      
      maxdist=0
      For ya=0 To 2
         If dist[ya]>maxdist Then maxdist=dist[ya]
      Next
      
      rx[0]=(x[0]+x[1])/2
      ry[0]=(y[0]+y[1])/2

      rx[1]=(x[0]+x[2])/2
      ry[1]=(y[0]+y[2])/2

      rx[2]=(x[2]+x[1])/2
      ry[2]=(y[2]+y[1])/2
      
;      For ya=0 To 2
;         Oval rx[ya]-5,ry[ya]-5,10,10
;      Next
      
      wink[0]=ATan2(x[0]-x[1],y[0]-y[1])
      wink[1]=ATan2(x[0]-x[2],y[0]-y[2])
      wink[2]=ATan2(x[1]-x[2],y[1]-y[2])
      
      For ya=0 To 2
         tx=rx[ya]
         ty=ry[ya]
         
         plusx=Sin(wink[ya]+90)*200
         plusy=Cos(wink[ya]+90)*200
         Line tx+plusx,ty+plusy,tx-plusx,ty-plusy
      Next

      inwink1[0]=ATan2(x[0]-x[1],y[0]-y[1])
      inwink2[0]=ATan2(x[0]-x[2],y[0]-y[2])
      inwink1[1]=ATan2(x[1]-x[2],y[1]-y[2])
      inwink2[1]=ATan2(x[1]-x[0],y[1]-y[0])
      inwink1[2]=ATan2(x[2]-x[0],y[2]-y[0])
      inwink2[2]=ATan2(x[2]-x[1],y[2]-y[1])
      
      inwink[0]=inwink1[0]+Shortwink(inwink1[0],inwink2[0])/2+180
      inwink[1]=inwink1[1]+Shortwink(inwink1[1],inwink2[1])/2+180
      inwink[2]=inwink1[2]+Shortwink(inwink1[2],inwink2[2])/2+180
      
      For ya=0 To 2
         xplus=Sin(inwink[ya])*maxdist
         yplus=Cos(inwink[ya])*maxdist
         Line x[ya],y[ya],x[ya]+xplus,y[ya]+yplus
      Next
      
   EndIf

   Color 255,255,255
   
   mh=MouseDown(1)
   If omh>0 Then mh=0:omh=omh-1
   If mh=1
      x[num]=MouseX()
      y[num]=MouseY()
      num=num+1
      If num>2 Then num=0
      omh=10
   EndIf
   
   If KeyDown(2) Then num=0
   If KeyDown(3) Then num=1
   If KeyDown(4) Then num=2
   
   Color 0,0,0
   Text 5,0,Shortwink(inwink1[0],inwink2[0])
   Text 5,15,Shortwink(inwink1[1],inwink2[1])
   Text 5,30,Shortwink(inwink1[2],inwink2[2])
   Color 255,255,255
   
   Flip
   Cls
   
Wend

FreeImage dt
End

Function wrapvalue#(wert#)
   
   While wert#>=360
      wert#=wert#-360
   Wend
   
   While wert#<0
      wert#=wert#+360
   Wend
   
   Return wert#

End Function

Function shortwink#(wert1#,wert2#)
   
   tdist#=wert1#-wert2#
   
   If Abs(tdist#)>180
      If wert1#>wert2#
         While wert1#>wert2#
            wert1#=wert1#-360
         Wend
      Else
         While wert1#<wert2#
            wert1#=wert1#+360
         Wend
      EndIf
   EndIf
   
   Return -(wert1#-wert2#)

End Function


Ist manchmal etwas unübersichtlich, bis man es raus hat aber sonst, ganz praktisch. Oder?
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Christoph

BeitragMi, Okt 04, 2006 12:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist gut. Ich würde noch die Farben etwas umändern, damit es übersichtlicher ist.

StepTiger

BeitragDo, Okt 05, 2006 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
und die schleichwerbung erst ^^

ist open source, also versuch dich Smile
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Christoph

BeitragDo, Okt 05, 2006 16:14
Antworten mit Zitat
Benutzer-Profile anzeigen
already done.
War nur mein Feedback Wink

Zitat:
ist open source, also versuch dich Smile

tss, als ob es schwer wäre, die Stelle zu suchen, an der Color steht. Wink

Markus2

BeitragDo, Okt 05, 2006 23:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich finds ein bischen wirr und hätte das anders gelößt .

Vectoren der Orte addieren und durch die Anzahl teilen
müßte einen guten Treffpunkt ergeben .
Untfernung von Ort zum Treffpunkt mit
dx=Ort.x-Treffpunkt.x
dy=Ort.y-Treffpunkt.y
Entf. Treffpunkt=sqr(dx*dx + dy*dy)

Christoph

BeitragFr, Okt 06, 2006 13:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Vectoren der Orte addieren und durch die Anzahl teilen
müßte einen guten Treffpunkt ergeben .

Dann weißt du, wo der Schwerpunkt des Dreiecks liegt.

Steptiger zeichnet die drei Seitenhalbierenden des Dreiecks ein, also bekommt er auch den Schwerpunkt heraus (und zwar dort wo sich die Seitenhalbierenden schneiden.)

D.h. du berechnest, wo er liegt. Steptiger aber zeigt gleich noch die Hilfslinien an, was etwas mehr Code benötigt.

Zitat:
Untfernung von Ort zum Treffpunkt mit
dx=Ort.x-Treffpunkt.x
dy=Ort.y-Treffpunkt.y
Entf. Treffpunkt=sqr(dx*dx + dy*dy)


[quote=Steptiger] dist[0]=Sqr((x[0]-x[1])^2+(y[0]-y[1])^2)
dist[1]=Sqr((x[0]-x[2])^2+(y[0]-y[2])^2)
dist[2]=Sqr((x[1]-x[2])^2+(y[1]-y[2])^2)[/quote]

Das ist die Stelle, die genau dasselbe macht.


Deine Lösungsvariante ist die selbe, du hast es nicht anders gelöst, allerhöchstens übersichtlicher Wink

StepTiger

BeitragFr, Okt 06, 2006 13:47
Antworten mit Zitat
Benutzer-Profile anzeigen
meine soll aber auf geometrischer basis existieren Smile
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Christoph

BeitragFr, Okt 06, 2006 14:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Deshalb hast du ja nicht den Schwerpunkt berechnet sondern mit geometrischen Linien gefunden.

Markus2

BeitragFr, Okt 06, 2006 18:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit wirr meinte ich auch eher zu viele Linien Wink
Meine Version mal aus langeweile Smile

Naja nicht gerade ausgewohen wenn man Hanover, Leipzig,München wählt .
@StepTiger wo wäre dabei bei dir der beste Treffpunkt ?


Code: [AUSKLAPPEN]

Graphics 375,499,32,2
SetBuffer BackBuffer()

MainLoop()
End

Function MainLoop()

 Local dt=LoadImage("DT.bmp")

 Local tpx,tpy
 Local num=0,i
 Local x[2]
 Local y[2]
 Local dist[2]
 
 While Not KeyDown(1)

   Cls   
   DrawImage dt,0,0

   Color 255,255,0
   ;Dreieck zeichnen
   Line x[0],y[0],x[1],y[1]
   Line x[1],y[1],x[2],y[2]
   Line x[2],y[2],x[0],y[0]

   tpx=(x[0]+x[1]+x[2])/3.0
   tpy=(y[0]+y[1]+y[2])/3.0

   ;Orte zum Treffpunkt
   Line x[0],y[0],tpx,tpy
   Line x[1],y[1],tpx,tpy
   Line x[2],y[2],tpx,tpy

   Punkt tpx,tpy
   For i=0 To 2
      If x[i]>0 And y[i]>0
         Punkt x[i],y[i]
      EndIf
   Next
       
   dist[0]=Sqr((x[0]-tpx)^2+(y[0]-tpy)^2)
   dist[1]=Sqr((x[1]-tpx)^2+(y[1]-tpy)^2)
   dist[2]=Sqr((x[2]-tpx)^2+(y[2]-tpy)^2)       
   maxdist=0
   For i=0 To 2
    If dist[i]>maxdist Then maxdist=dist[i]
   Next
       
   If MouseHit(1) Then
      x[num]=MouseX()
      y[num]=MouseY()
      dist[num]=0
      dist[num]=0
      num=num+1
      If num>2 Then num=0
   EndIf
   
   If KeyDown(2) Then num=0
   If KeyDown(3) Then num=1
   If KeyDown(4) Then num=2
   
   Color 0,0,0
   Text 5, 0,"Entfernung 1 = " +dist[0]
   Text 5,15,"Entfernung 2 = " +dist[1]
   Text 5,30,"Entfernung 3 = " +dist[2]
   Text 5,45,"Max. Entfernung = " +maxdist
   
   Flip
   
 Wend

 FreeImage dt

End Function

Function Punkt(x,y)
 Color 0,0,0
 Oval x-6,y-6,12,12,1
 Color 255,128,64
 Oval x-5,y-5,10,10,1
End Function

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group