Momentan geht es um folgende Dreiecke:

Meine Idee wäre, zunächst das passende Rechteck zu grabben und dann per Linien
die Flächen, die nicht benötigt werden "wegzuradieren".
Geht das auch einfacher?
Code: Alles auswählen
Procedure Combine()
If StartDrawing( ImageOutput(3) )
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0,0,200,200,RGBA($FF,$FF,$FF,$00))
DrawingMode(#PB_2DDrawing_AlphaChannel)
DrawAlphaImage(ImageID(2),0,0)
DrawingMode(#PB_2DDrawing_AlphaClip)
DrawAlphaImage(ImageID(1),0,0)
StopDrawing()
EndIf
If StartDrawing( CanvasOutput(3) )
Box(0,0,200,200,RGBA($FF,$FF,$FF,$FF))
DrawAlphaImage(ImageID(3),0,0)
StopDrawing()
EndIf
EndProcedure
Procedure Paint()
If GetGadgetAttribute(1, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
x = GetGadgetAttribute(1, #PB_Canvas_MouseX)
y = GetGadgetAttribute(1, #PB_Canvas_MouseY)
If StartDrawing( ImageOutput(1) )
DrawingMode(#PB_2DDrawing_AlphaBlend)
Circle(x,y,10,RGBA(Random($FF),Random($FF),Random($FF),Random($FF)))
StopDrawing()
EndIf
If StartDrawing( CanvasOutput(1) )
Box(0,0,200,200,RGBA($FF,$FF,$FF,$FF))
DrawAlphaImage(ImageID(1),0,0)
StopDrawing()
EndIf
Combine()
EndIf
EndProcedure
Procedure Mask()
If GetGadgetAttribute(2, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
x = GetGadgetAttribute(2, #PB_Canvas_MouseX)
y = GetGadgetAttribute(2, #PB_Canvas_MouseY)
If StartDrawing( ImageOutput(2) )
DrawingMode(#PB_2DDrawing_AlphaBlend)
Circle(x,y,5,RGBA($00,$00,$00,$FF))
StopDrawing()
EndIf
If StartDrawing( CanvasOutput(2) )
Box(0,0,200,200,RGBA($FF,$FF,$FF,$FF))
DrawAlphaImage(ImageID(2),0,0)
StopDrawing()
EndIf
Combine()
EndIf
EndProcedure
CreateImage(1,200,200,32,#PB_Image_Transparent)
CreateImage(2,200,200,32,#PB_Image_Transparent)
CreateImage(3,200,200,32,#PB_Image_Transparent)
If OpenWindow(0, 0, 0, 600, 200, "2D Drawing Masked")
CanvasGadget(1, 0 , 0, 200, 200, #PB_Canvas_Border)
BindGadgetEvent(1, @Paint(), #PB_EventType_MouseMove)
CanvasGadget(2, 200, 0, 200, 200, #PB_Canvas_Border)
BindGadgetEvent(2, @Mask(), #PB_EventType_MouseMove)
CanvasGadget(3, 400, 0, 200, 200, #PB_Canvas_Border)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Code: Alles auswählen
Procedure Triangle(hdc,x1.l, y1.l, x2.l, y2.l, x3.l, y3.l)
ProcedureReturn Polygon_(hdc, @x1, 3)
EndProcedure
Code: Alles auswählen
FillArea( (x1 + x2 + x3)/3, (y1 + y2 + y3)/3, #White, #White)