Page 1 of 1
filled polygons
Posted: Fri Aug 15, 2003 7:22 pm
by coma
Apparently, and curiously, there's no polygon command on PureBasic.
I just want to draw filled 2d polygons (convex quadrilateral, or 2 triangles).
Does anybody have a fast procedure ? To be fast, it certainly have to be coded in ASM, but I dont't know it.
thks.
Posted: Sun Aug 17, 2003 7:01 am
by coma
well......
I have made a little filled triangle routine.
It's an adaptation for Purebasic of this =>
http://www.mat.uni.torun.pl/~wrona/3d_t ... llers.html
Code: Select all
Procedure flat_triangle(x1,y1,x2,y2,x3,y3,colour)
;sort vertices,to obtain y1<y2<y3 (to improve :))
If y2>y3 : y0=y3 : y3=y2 : y2=y0 : x0=x3 : x3=x2 : x2=x0 : EndIf
If y1>y2 : y0=y2 : y2=y1 : y1=y0 : x0=x2 : x2=x1 : x1=x0 : EndIf
If y1>y3 : y0=y3 : y3=y1 : y1=y0 : x0=x3 : x3=x1 : x1=x0 : EndIf
If y2>y3 : y0=y3 : y3=y2 : y2=y0 : x0=x3 : x3=x2: x2=x0 : EndIf
dx1.f=(x2-x1)/(y2-y1)
dx2.f=(x3-x1)/(y3-y1)
dx3.f=(x3-x2)/(y3-y2)
Sx.f=x1 : Ex.f=x1 : Y=y1
If(dx1>dx2)
Repeat
Y+1
Sx+dx2
Ex+dx1
LineXY(Sx,Y,Ex,Y,colour)
Until Y>=y2
Ex=x2 : Ey=y2
Repeat
Y+1 : Sx+dx2 : Ex+dx3
LineXY(Sx,Y,Ex,Y,colour)
Until Y>=y3
Else
Repeat
Y+1 : Sx+dx1 : Ex+dx2
LineXY(Sx,Y,Ex,Y,colour)
Until Y>=y2
Sx=x2 : Sy=y2
Repeat
Y+1 : Sx+dx3 : Ex+dx2
LineXY(Sx,Y,Ex,Y,colour)
Until Y>=y3
EndIf
EndProcedure
I need To code a fastest routine in ASM, to replace LineXY().
A better method would be to use direct3d polygons, with hardware acceleration, but I don't know how to do this... Do you think it's possible ?
Posted: Sun Aug 17, 2003 8:04 am
by Rings
have you ever searched the Win-Api32 for Polygon ?
there are many apis related to.
the simplest api named ' Polygon_(hdC,*Points,count_points)'
Posted: Sun Aug 17, 2003 2:14 pm
by coma
does this method works on a graphical screen open with OpenScreen() ???
by the way, I think Win-Api32 must only be used if there's any other solution. And I don't think polygon() api is very optimised.
Posted: Sun Aug 17, 2003 7:14 pm
by Rings
coma wrote:does this method works on a graphical screen open with OpenScreen() ??? .
it does.For hdc you have to use the Screenoutput() Function.
coma wrote: And I don't think polygon() api is very optimised.
well thats your point of view.I have seen a lot of Polygon-examples under vb that are realy fast.
Posted: Sun Aug 17, 2003 8:10 pm
by Flype
i tried and it works well. I think polyline() is fast enough for common use... but i encountered a problem in this code : how can i change the color of polylines ? I tried FrontColor() just before PolyLine_() but it doesn't work !
Code: Select all
Structure POINTTRIANGLE
pointA.POINT
pointB.POINT
pointC.POINT
pointD.POINT
EndStructure
Procedure TriangleFlat( x1, y1, x2, y2, x3, y3, color )
triangle.POINTTRIANGLE
triangle\pointA\x = x1
triangle\pointA\y = y1
triangle\pointB\x = x2
triangle\pointB\y = y2
triangle\pointC\x = x3
triangle\pointC\y = y3
triangle\pointD\x = x1
triangle\pointD\y = y1
Polyline_( GetDC_( WindowID() ), @triangle, 4 )
FillArea( triangle\pointA\x, triangle\pointA\y+2, 0, color )
EndProcedure
If OpenWindow(0,200,200,200,200,#PB_Window_SystemMenu,"")
StartDrawing( WindowOutput() )
TriangleFlat( 100,10, 10,180, 180,180, $FFFFFF )
StopDrawing()
While WaitWindowEvent() <> #WM_CLOSE : Wend
EndIf
Posted: Sun Aug 17, 2003 9:00 pm
by coma
When I try to draw a triangle on ScreenOutput(), to make animations, I have a flickering problem.
Code: Select all
Structure POINTTRIANGLE
pointA.POINT
pointB.POINT
pointC.POINT
EndStructure
Procedure TriangleFlat( x1, y1, x2, y2, x3, y3, color )
triangle.POINTTRIANGLE
triangle\pointA\x = x1
triangle\pointA\y = y1
triangle\pointB\x = x2
triangle\pointB\y = y2
triangle\pointC\x = x3
triangle\pointC\y = y3
Polygon_(GetDC_( WindowID() ), @triangle, 3)
EndProcedure
InitSprite()
InitKeyboard()
OpenWindow(0,0,0,400,200,#PB_Window_ScreenCentered | #PB_Window_SystemMenu,"test")
OpenWindowedScreen(WindowID(), 0, 0, 400, 200,0,0,0)
Repeat
ClearScreen(100,80,120)
StartDrawing(ScreenOutput())
Box (x,10,50,50,$ffffff)
triangleFlat(x+100,10, x,180, x+180,180, 0)
StopDrawing()
x=x+1 : If x>300 : x=0 : EndIf
FlipBuffers()
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
End