filled polygons

Just starting out? Need help? Post your questions and find answers here.
coma
Enthusiast
Enthusiast
Posts: 164
Joined: Fri Aug 15, 2003 3:46 am
Location: Canada

filled polygons

Post 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.
coma
Enthusiast
Enthusiast
Posts: 164
Joined: Fri Aug 15, 2003 3:46 am
Location: Canada

Post 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 ?
User avatar
Rings
Moderator
Moderator
Posts: 1435
Joined: Sat Apr 26, 2003 1:11 am

Post 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)'
SPAMINATOR NR.1
coma
Enthusiast
Enthusiast
Posts: 164
Joined: Fri Aug 15, 2003 3:46 am
Location: Canada

Post 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.
User avatar
Rings
Moderator
Moderator
Posts: 1435
Joined: Sat Apr 26, 2003 1:11 am

Post 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.
SPAMINATOR NR.1
User avatar
Flype
Addict
Addict
Posts: 1542
Joined: Tue Jul 22, 2003 5:02 pm
Location: In a long distant galaxy

Post 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
No programming language is perfect. There is not even a single best language.
There are only languages well suited or perhaps poorly suited for particular purposes. Herbert Mayer
coma
Enthusiast
Enthusiast
Posts: 164
Joined: Fri Aug 15, 2003 3:46 am
Location: Canada

Post 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
Post Reply