Hier ein Beispiel mit Flächeninhalt :
Code: Alles auswählen
Structure Point2D
x.f
y.f
EndStructure
Structure Triangle
Point2D.Point2D[3]
Area.f
EndStructure
Global Triangle.Triangle
Procedure TriangleArea(*Triangle.Triangle)
With *Triangle
Protected v0.f = Sqr(Pow(\Point2D[1]\x-\Point2D[2]\x,2)+Pow(\Point2D[1]\y-\Point2D[2]\y,2))
Protected v1.f = Sqr(Pow(\Point2D[0]\x-\Point2D[2]\x,2)+Pow(\Point2D[0]\y-\Point2D[2]\y,2))
Protected v2.f = Sqr(Pow(\Point2D[0]\x-\Point2D[1]\x,2)+Pow(\Point2D[0]\y-\Point2D[1]\y,2))
Protected Gamma.f = ACos( - (v0*v0-v1*v1-v2*v2) / (2*v1*v2) )
ProcedureReturn 0.5*v1*v2*Sin(Gamma)
EndWith
EndProcedure
Procedure CreateTriangle(x1.f, y1.f, x2.f, y2.f, x3.f, y3.f)
*Triangle.Triangle = AllocateMemory(SizeOf(Triangle))
With *Triangle
\Point2D[0]\x = x1
\Point2D[0]\y = y1
\Point2D[1]\x = x2
\Point2D[1]\y = y2
\Point2D[2]\x = x3
\Point2D[2]\y = y3
\Area = TriangleArea(*Triangle)
EndWith
ProcedureReturn *Triangle
EndProcedure
Procedure.f GetTriangleFactor(*Triangle.Triangle, x.f, y.f, Angle)
Protected SavePoint2D.Point2D, Area.f
With *Triangle
SavePoint2D\x = \Point2D[Angle]\x
SavePoint2D\y = \Point2D[Angle]\y
\Point2D[Angle]\x = x
\Point2D[Angle]\y = y
Area = TriangleArea(*Triangle)
\Point2D[Angle]\x = SavePoint2D\x
\Point2D[Angle]\y = SavePoint2D\y
ProcedureReturn Area / \Area
EndWith
EndProcedure
InitSprite()
xP = 400
yP = 400
OpenWindow(0, 0, 0, xP, yP, "SCREEN", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, xP, yP, 0, 0, 0)
*Triangle.Triangle = CreateTriangle(200+Cos(0)*150,200+Sin(0)*150, 200+Cos(#PI*2/3)*150,200+Sin(#PI*2/3)*150, 200+Cos(-#PI*2/3)*150,200+Sin(-#PI*2/3)*150)
Repeat
Event = WindowEvent()
ClearScreen(0)
x = WindowMouseX(0)
y = WindowMouseY(0)
StartDrawing(ScreenOutput())
DrawingMode(1)
With *Triangle
For n = 0 To 2
LineXY(\Point2D[n]\x, \Point2D[n]\y, \Point2D[(n+1)%3]\x, \Point2D[(n+1)%3]\y, $FFFFFF)
LineXY(\Point2D[n]\x, \Point2D[n]\y, x, y, $808080)
DrawText(\Point2D[n]\x, \Point2D[n]\y, Str(n+1), $00FFFF)
Next
EndWith
Circle(x,y,10,$0000FF)
For n = 0 To 2
DrawText(300,n*30, "Ecke"+Str(n+1)+" ist :"+StrF(GetTriangleFactor(*Triangle, x, y, n)*100,0)+"%", $00FF00)
Next
StopDrawing()
FlipBuffers()
Until Event = #PB_Event_CloseWindow
Klar das außerhalb des Dreiecks über 100% zustande kommt, aber das kannst du ja sicher selber noch fixen
Innerhalb des Dreiecks geht alles so wie du es möchtest.
In der mitte alle 0.333 , an den ecke, die jeweilige Ecke 1.0