forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=109)
-   -   Функции работы с геометрией для игр (http://forum.boolean.name/showthread.php?t=7742)

zheland 01.02.2009 00:46

Функции работы с геометрией для игр
 
Вот решил вернуться временно к BlitzMax.
Создаю функции работы с геометрией для 2d игр.
Пока применения им нету,
но потом создам более мощные функции,
например для определения столкновений.

Пока только:
1: Определение дистанции
2: Нормирование
3: Проекция
(получение нового вектора,
с помощью проецирования другово вектора на прямую)

Статья: http://noregret.org/tutor/n/collision/
Очень хорошая статья

Код:

''''''''''''''''''''''''''''''Проект''''''''''''''''''''''''''''''
SuperStrict
SeedRnd(MilliSecs())
AppTitle$ = "GEOMETRY FUNCTIONS VERSION 1.0"
''''''''''''''''''''''''''''''Типы''''''''''''''''''''''''''''''
Global azgf_function : String[3]
Global azgf_forms : Byte[3]
Global azgf_form : tzgf_form[4]
Type tzgf_form
        Field f: Byte
        Field x: Short
        Field y: Short
        Field w: Short
        Field h: Short
        Field a: Short
        Field r: Byte
        Field g: Byte
        Field b: Byte
        Field s: Byte
        Method Update( _c: Byte )
                If point_d = 1 And MouseX()>x-w And MouseX()<x+w And MouseY()>y-h And MouseY()<y+h
                        point_n=_c
                End If
                If point_n=_c And point_d>0
                        x=MouseX()
                        If x<(gfx_width-gfx_height) Then x=gfx_width-gfx_height
                        If x>gfx_width Then x=gfx_width
                        y=MouseY()
                        If y<0 Then y=0
                        If y>gfx_width Then y=gfx_width
                End If
                If x<0 Then x = 0
                If y<0 Then y = 0
                If x>gfx_width Then x = gfx_width
                If y>gfx_height Then y = gfx_height
        End Method
        Method Draw( _c: Byte )
                SetColor r,g,b
                If f=1
                        DrawRect x-w,y-h,w*2,h*2
                        DrawText _c,x+w,y+h
                End If
        End Method
        Function Create: tzgf_form( _f: Byte, _x: Short, _y: Short, _w: Short, _h: Short, _a: Short, _r: Byte, _g: Byte, _b: Byte, _s: Byte )
                Local _obj: tzgf_form= New tzgf_form
                _obj.f= _f
                _obj.x= _x
                _obj.y= _y
                _obj.w= _w
                _obj.h= _h
                _obj.a= _a
                _obj.r= _r
                _obj.g= _g
                _obj.b= _b
                _obj.s= _s
                Return _obj: tzgf_form
        End Function
End Type
''''''''''''''''''''''''''''''Переменные''''''''''''''''''''''''''''''
Global menu: Byte= False
Global gfx_width: Int= 640
Global gfx_height: Int= 480
Global gfx_widthdiv: Int= gfx_width/2
Global gfx_heightdiv: Int= gfx_height/2
Global gfx_depth: Int= 32
Global gfx_hertz: Int= 75

Global time_old: Long
Global time_new: Short
Global time_next: Long
Global time_nrnd_max: Short
Global time_nrnd_min: Short
Global time_nfps: Short
Global time_ornd_max: Short
Global time_ornd_min: Short
Global time_ofps: Short

Global point_d: Byte= 0
Global point_m: Byte= False
Global point_r: Byte= False
Global point_f: Byte= 0
Global point_n: Byte= 255

Global n: Short= 0
''''''''''''''''''''''''''''''Загрузка''''''''''''''''''''''''''''''
azgf_function[0]="distance"
azgf_function[1]="normalization"
azgf_function[2]="projection"
azgf_forms[0]=2
azgf_forms[1]=3
azgf_forms[2]=4
fzgf_create( )
''''''''''''''''''''''''''''''Установка графики''''''''''''''''''''''''''''''
SetGraphicsDriver GLMax2DDriver()
Graphics gfx_width , gfx_height , 0 , 0
AutoMidHandle(True)
ShowMouse()
SetClsColor 127,127,127
''''''''''''''''''''''''''''''Главный цикл''''''''''''''''''''''''''''''
While Not KeyDown(KEY_ESCAPE)
        time_new=(MilliSecs()-time_old)
        time_old=MilliSecs()
        If time_next < time_old
                time_next=time_old/1000*1000+1000
                time_ornd_max=time_nrnd_max
                time_ornd_min=time_nrnd_min
                time_ofps=time_nfps
                time_nrnd_max=0
                time_nrnd_min=65535
                time_nfps=0
        End If
        time_nfps:+1
        If time_nrnd_max < time_new Then time_nrnd_max = time_new
        If time_nrnd_min > time_new Then time_nrnd_min = time_new
        Cls
       
        If MouseDown(MOUSE_LEFT) And point_d=0 Then point_d=1
        If Not MouseDown(MOUSE_LEFT)
                point_d=0
                point_n=255
        End If
        For n = 0 Until azgf_forms[point_f]
                If azgf_form[n].s= 1 Or azgf_form[n].s= 3 Then azgf_form[n].Update(n)
        Next
        fzgf_update( )       
        For n = 0 Until azgf_forms[point_f]
                If azgf_form[n].s> 1  Then azgf_form[n].Draw(n+1)
        Next
       
        If point_d=1 Then point_d=2

        SetColor 255,255,255
        DrawLine gfx_width-gfx_height,0,gfx_width-gfx_height,gfx_height
        DrawText "GEOMETRY FUNCTIONS" , 0 , 0
        DrawText "VERSION 1.0" , 0 , 10
        DrawText "AUTHOR: ZHELEZNOV" , 0 , 20
        DrawText " ANDREY IVANOVICH" , 0 , 30
       
        DrawText "SET FUNCTION" , 0 , 50
        DrawText " WITH KEY TAB" , 0 , 60
        DrawText " CURRENT IS "+point_f , 0 , 70
        DrawText " NAME IS " , 0 , 80
        DrawText "  "+azgf_function[point_f] , 0 , 90
       
        If KeyHit(KEY_TAB)
                point_f:+1
                If point_f>2 Then point_f=0
                fzgf_create( )
        End If
       
        DrawText "FRAME: " + time_ornd_Min + "ms-" + time_ornd_max + "ms"  , 0 , gfx_height-30
        DrawText "FPS: " + time_ofps + "frame/s"    , 0 , gfx_height-20
        Flip
Wend
End

Function fzgf_create( )
Select point_f
Case 0
azgf_form[0]= tzgf_form.Create( 1,300,100,5,5,0,255,0,0,3 )
azgf_form[1]= tzgf_form.Create( 1,400,200,5,5,0,0,0,255,3 )
Case 1
azgf_form[0]= tzgf_form.Create( 1,300,100,5,5,0,255,0,0,3 )
azgf_form[1]= tzgf_form.Create( 1,400,200,5,5,0,0,0,255,3 )
azgf_form[2]= tzgf_form.Create( 1,200,0,5,5,0,0,255,0,2 )
Case 2
azgf_form[0]= tzgf_form.Create( 1,300,200,5,5,0,255,0,0,3 )
azgf_form[1]= tzgf_form.Create( 1,400,200,5,5,0,255,0,0,3 )
azgf_form[2]= tzgf_form.Create( 1,350,100,5,5,0,0,0,255,3 )
azgf_form[3]= tzgf_form.Create( 1,200,0,5,5,0,0,255,0,2 )
End Select
End Function

Function fzgf_update( )
Local _x1:Int, _y1:Int, _x2:Int, _y2:Int, _xxpyy:Float, _distance:Double
SetColor 255,255,255
Select point_f



Case 0
DrawText "x1="+azgf_form[0].x , 0 , 120
DrawText "y1="+azgf_form[0].y , 0 , 130
DrawText "x2="+azgf_form[1].x , 0 , 140
DrawText "y2="+azgf_form[1].y , 0 , 150
_x1=azgf_form[1].x-azgf_form[0].x
DrawText "x=x2-x1="+_x1 , 0 , 160
_y1=azgf_form[1].y-azgf_form[0].y
DrawText "y=y2-y1="+_y1 , 0 , 170
DrawText "DISTATION=" , 0 , 180
DrawText " =sqrt(x*x+y*y)=" , 0 , 190
DrawText " =sqrt("+_x1+"*"+_x1+"+" , 0 , 200
DrawText " +"+_y1+"*"+_y1+")=" , 0 , 210
_xxpyy=_x1*_x1+_y1*_y1
DrawText " =sqrt("+_xxpyy+")=" , 0 , 220
_distance=Sqr(_xxpyy)
DrawText " ="+_distance , 0 , 230



Case 1
DrawText "x1="+azgf_form[0].x , 0 , 120
DrawText "y1="+azgf_form[0].y , 0 , 130
DrawText "x2="+azgf_form[1].x , 0 , 140
DrawText "y2="+azgf_form[1].y , 0 , 150
_x1=azgf_form[1].x-azgf_form[0].x
DrawText "x=x2-x1="+_x1 , 0 , 160
_y1=azgf_form[1].y-azgf_form[0].y
DrawText "y=y2-y1="+_y1 , 0 , 170
DrawText "DISTATION=" , 0 , 180
DrawText " =sqrt(x*x+y*y)=" , 0 , 190
_xxpyy=_x1*_x1+_y1*_y1
_distance=Sqr(_xxpyy)
DrawText " ="+_distance , 0 , 200
If _distance<>0
azgf_form[2].x=azgf_form[0].x+_x1/_distance*100
azgf_form[2].y=azgf_form[0].y+_y1/_distance*100
DrawText "x3=x1+x/DIST*100=" , 0 , 210
DrawText " ="+azgf_form[2].x , 0 , 220
DrawText "y3=y1+y/DIST*100=" , 0 , 230
DrawText " ="+azgf_form[2].y , 0 , 240
Else
DrawText "DIV TO 0" , 0 , 210
End If
SetLineWidth 5
SetColor 255,255,0
DrawLine azgf_form[0].x,azgf_form[0].y,azgf_form[2].x,azgf_form[2].y
SetLineWidth 1



Case 2
DrawText "x1="+azgf_form[0].x , 0 , 120
DrawText "y1="+azgf_form[0].y , 0 , 130
DrawText "x2="+azgf_form[1].x , 0 , 140
DrawText "y2="+azgf_form[1].y , 0 , 150
DrawText "x3="+azgf_form[2].x , 0 , 160
DrawText "y3="+azgf_form[2].y , 0 , 170
_x1=azgf_form[1].x-azgf_form[0].x
DrawText "x=x2-x1="+_x1 , 0 , 180
_y1=azgf_form[1].y-azgf_form[0].y
DrawText "y=y2-y1="+_y1 , 0 , 190
_x2=azgf_form[0].x-azgf_form[2].x
DrawText "vx=x3-x1="+_x2 , 0 , 200
_y2=azgf_form[0].y-azgf_form[2].y
DrawText "vy=y3-y1="+_y2 , 0 , 210
_xxpyy=Float(_x2*_x1+_y2*_y1)/Float(_x1*_x1+_y1*_y1)
DrawText "coefficient=" , 0 , 220
DrawText " =(vx*_x+_vy*_y)/" , 0 , 230
DrawText " /(x*_x+_y*_y)=" , 0 , 240
DrawText " =("+_x2+"*"+_x1+"+" , 0 , 250
DrawText " +"+_y2+"*"+_y1+")/" , 0 , 260
DrawText " /("+_x1+"*"+_x1+"+" , 0 , 270
DrawText " +"+_y1+"*"+_y1+")=" , 0 , 280
DrawText " ="+_xxpyy , 0 , 290
DrawText "x4=x1-coeff*x=" , 0 , 300
DrawText " ="+(azgf_form[0].x-_xxpyy*_x1) , 0 , 310
DrawText "y4=y1-coeff*y=" , 0 , 320
DrawText " ="+(azgf_form[0].y-_xxpyy*_y1) , 0 , 330
azgf_form[3].x=azgf_form[0].x-_xxpyy*_x1
azgf_form[3].y=azgf_form[0].y-_xxpyy*_y1
SetLineWidth 3
SetColor 255,0,0
DrawLine azgf_form[0].x,azgf_form[0].y,azgf_form[1].x,azgf_form[1].y
SetColor 0,0,255
DrawLine azgf_form[0].x,azgf_form[0].y,azgf_form[2].x,azgf_form[2].y
SetColor 0,255,0
DrawLine azgf_form[0].x,azgf_form[0].y,azgf_form[3].x,azgf_form[3].y
SetLineWidth 1



End Select
End Function


zheland 02.02.2009 00:02

Ответ: Функции работы с геометрией для игр
 
Вот уже есть опыт для определения столкновения квадратов.
Пока код не очень удачный, но на этом примере
я понял как определять столкновения разных фигур.

Опять-же рекомендую хорошую статью по коллизиям,
в ней изложен один из способов: http://noregret.org/tutor/n/collision/

Добавлена новая функция квадраты:

Действует по формулам в конце статьи.

Версия 2.0
Код:

''''''''''''''''''''''''''''''Проект''''''''''''''''''''''''''''''
SuperStrict
SeedRnd(MilliSecs())
AppTitle$ = "GEOMETRY FUNCTIONS VERSION 1.0"
''''''''''''''''''''''''''''''Типы''''''''''''''''''''''''''''''
Global azgf_function : String[4]
Global azgf_forms : Byte[4]
Global azgf_form : tzgf_form[18]
Type tzgf_form
        Field f: Byte
        Field x: Short
        Field y: Short
        Field w: Short
        Field h: Short
        Field a: Short
        Field r: Byte
        Field g: Byte
        Field b: Byte
        Field s: Byte
        Method Update( _c: Byte )
                Local _a:Int
                If point_m = 1 And MouseX()>x-w And MouseX()<x+w And MouseY()>y-h And MouseY()<y+h
                        point_n=_c
                        point_x=MouseX()-x
                        point_y=MouseY()-y
                End If
                If point_n=_c And point_m>0
                        x=MouseX()-point_x
                        If x<(gfx_width-gfx_height) Then x=gfx_width-gfx_height
                        If x>gfx_width Then x=gfx_width
                        y=MouseY()-point_y
                        If y<0 Then y=0
                        If y>gfx_width Then y=gfx_width
                Else
                        If point_r = 1 And MouseX()>x-w And MouseX()<x+w And MouseY()>y-h And MouseY()<y+h
                                point_n=_c
                                point_a=a-MouseX()
                        End If
                        If point_n=_c And point_r>0
                                _a=MouseX()+point_a
                                While _a<0
                                _a:+360
                                Wend
                                While _a>=360
                                _a:-360
                                Wend
                                a=_a
                        End If
                End If
                If x<0 Then x = 0
                If y<0 Then y = 0
                If x>gfx_width Then x = gfx_width
                If y>gfx_height Then y = gfx_height
        End Method
        Method Draw( _c: Byte )
                SetColor r,g,b
                If f=1
                        DrawRect x-w,y-h,w*2,h*2
                        DrawText _c,x+w,y+h
                ElseIf f=2
                        SetHandle w,h
                        SetRotation a
                        DrawRect x,y,w*2,h*2
                        SetHandle 0,0
                        SetRotation 0
                        DrawText _c,x+w,y+h
                End If
        End Method
        Function Create: tzgf_form( _f: Byte, _x: Short, _y: Short, _w: Short, _h: Short, _a: Short, _r: Byte, _g: Byte, _b: Byte, _s: Byte )
                Local _obj: tzgf_form= New tzgf_form
                _obj.f= _f
                _obj.x= _x
                _obj.y= _y
                _obj.w= _w
                _obj.h= _h
                _obj.a= _a
                _obj.r= _r
                _obj.g= _g
                _obj.b= _b
                _obj.s= _s
                Return _obj: tzgf_form
        End Function
End Type
''''''''''''''''''''''''''''''Переменные''''''''''''''''''''''''''''''
Global menu: Byte= False
Global gfx_width: Int= 640
Global gfx_height: Int= 480
Global gfx_widthdiv: Int= gfx_width/2
Global gfx_heightdiv: Int= gfx_height/2
Global gfx_depth: Int= 32
Global gfx_hertz: Int= 75

Global time_old: Long
Global time_new: Short
Global time_next: Long
Global time_nrnd_max: Short
Global time_nrnd_min: Short
Global time_nfps: Short
Global time_ornd_max: Short
Global time_ornd_min: Short
Global time_ofps: Short

Global point_m: Byte= 0
Global point_r: Byte= 0

Global point_f: Byte= 0
Global point_n: Byte= 255

Global point_x: Int= 0
Global point_y: Int= 0
Global point_a: Int= 0

Global n: Short= 0

Global sqrt2: Double= Sqr(2)
''''''''''''''''''''''''''''''Загрузка''''''''''''''''''''''''''''''
azgf_function[0]="distance"
azgf_function[1]="normalization"
azgf_function[2]="projection"
azgf_function[3]="rectslanges"
azgf_forms[0]=2
azgf_forms[1]=3
azgf_forms[2]=4
azgf_forms[3]=18
fzgf_create( )
''''''''''''''''''''''''''''''Установка графики''''''''''''''''''''''''''''''
SetGraphicsDriver GLMax2DDriver()
Graphics gfx_width , gfx_height , 0 , 0
AutoMidHandle(True)
ShowMouse()
SetClsColor 127,127,127
''''''''''''''''''''''''''''''Главный цикл''''''''''''''''''''''''''''''
While Not KeyDown(KEY_ESCAPE)
        time_new=(MilliSecs()-time_old)
        time_old=MilliSecs()
        If time_next < time_old
                time_next=time_old/1000*1000+1000
                time_ornd_max=time_nrnd_max
                time_ornd_min=time_nrnd_min
                time_ofps=time_nfps
                time_nrnd_max=0
                time_nrnd_min=65535
                time_nfps=0
        End If
        time_nfps:+1
        If time_nrnd_max < time_new Then time_nrnd_max = time_new
        If time_nrnd_min > time_new Then time_nrnd_min = time_new
        Cls
       
        If MouseDown(MOUSE_LEFT) And point_m=0 Then point_m=1
        If Not MouseDown(MOUSE_LEFT) Then point_m=0

        If MouseDown(MOUSE_RIGHT) And point_r=0 Then point_r=1
        If Not MouseDown(MOUSE_RIGHT) Then point_r=0

        If point_m=0 And point_r=0 Then point_n=255

        SetViewport gfx_width-gfx_height,0,gfx_width,gfx_height
        For n = 0 Until azgf_forms[point_f]
                If azgf_form[n].s= 1 Or azgf_form[n].s= 3 Then azgf_form[n].Update(n)
        Next
        fzgf_update( )       
        For n = 0 Until azgf_forms[point_f]
                If azgf_form[n].s> 1  Then azgf_form[n].Draw(n+1)
        Next
        SetViewport 0,0,gfx_width,gfx_height
       
        If point_m=1 Then point_m=2
        If point_r=1 Then point_r=2

        SetColor 255,255,255
        DrawLine gfx_width-gfx_height,0,gfx_width-gfx_height,gfx_height
        DrawText "GEOMETRY FUNCTIONS" , 0 , 0
        DrawText "VERSION 2.0" , 0 , 10
        DrawText "AUTHOR: ZHELEZNOV" , 0 , 20
        DrawText " ANDREY IVANOVICH" , 0 , 30
       
        DrawText "SET FUNCTION" , 0 , 50
        DrawText " WITH KEY TAB" , 0 , 60
        DrawText " CURRENT IS "+point_f , 0 , 70
        DrawText " NAME IS " , 0 , 80
        DrawText "  "+azgf_function[point_f] , 0 , 90
       
        If KeyHit(KEY_TAB)
                point_f:+1
                If point_f>3 Then point_f=0
                fzgf_create( )
        End If

        DrawText "MOVE:    MOUSE_LEFT"  , 0 , gfx_height-70
        DrawText "ROTATION:MOUSE_RIGHT" , 0 , gfx_height-60
        DrawText "EXIT:KEYBOARD_ESCAPE" , 0 , gfx_height-50

        DrawText "FRAME: " + time_ornd_Min + "ms-" + time_ornd_max + "ms"  , 0 , gfx_height-30
        DrawText "FPS: " + time_ofps + "frame/s"    , 0 , gfx_height-20
        Flip
Wend
End

Function fzgf_create( )
Select point_f
Case 0
azgf_form[0]= tzgf_form.Create( 1,300,100,5,5,0,255,0,0,3 )
azgf_form[1]= tzgf_form.Create( 1,400,200,5,5,0,0,0,255,3 )
Case 1
azgf_form[0]= tzgf_form.Create( 1,300,100,5,5,0,255,0,0,3 )
azgf_form[1]= tzgf_form.Create( 1,400,200,5,5,0,0,0,255,3 )
azgf_form[2]= tzgf_form.Create( 1,200,0,5,5,0,0,255,0,2 )
Case 2
azgf_form[0]= tzgf_form.Create( 1,300,200,5,5,0,255,0,0,3 )
azgf_form[1]= tzgf_form.Create( 1,400,200,5,5,0,255,0,0,3 )
azgf_form[2]= tzgf_form.Create( 1,350,100,5,5,0,0,0,255,3 )
azgf_form[3]= tzgf_form.Create( 1,200,0,5,5,0,0,255,0,2 )
Case 3
azgf_form[0]= tzgf_form.Create( 2,300,100,32,32,0,255,0,0,3 )
azgf_form[1]= tzgf_form.Create( 2,400,200,32,32,0,0,0,255,3 )

azgf_form[2]= tzgf_form.Create( 1,200,0,5,5,0,255,255,0,2 )
azgf_form[3]= tzgf_form.Create( 1,200,0,5,5,0,255,255,0,2 )
azgf_form[4]= tzgf_form.Create( 1,200,0,5,5,0,255,255,0,2 )
azgf_form[5]= tzgf_form.Create( 1,200,0,5,5,0,255,255,0,2 )
azgf_form[6]= tzgf_form.Create( 1,200,0,5,5,0,255,255,0,2 )
azgf_form[7]= tzgf_form.Create( 1,200,0,5,5,0,255,255,0,2 )
azgf_form[8]= tzgf_form.Create( 1,200,0,5,5,0,255,255,0,2 )
azgf_form[9]= tzgf_form.Create( 1,200,0,5,5,0,255,255,0,2 )

azgf_form[10]= tzgf_form.Create( 1,200,0,5,5,0,0,255,255,2 )
azgf_form[11]= tzgf_form.Create( 1,200,0,5,5,0,0,255,255,2 )
azgf_form[12]= tzgf_form.Create( 1,200,0,5,5,0,0,255,255,2 )
azgf_form[13]= tzgf_form.Create( 1,200,0,5,5,0,0,255,255,2 )
azgf_form[14]= tzgf_form.Create( 1,200,0,5,5,0,0,255,255,2 )
azgf_form[15]= tzgf_form.Create( 1,200,0,5,5,0,0,255,255,2 )
azgf_form[16]= tzgf_form.Create( 1,200,0,5,5,0,0,255,255,2 )
azgf_form[17]= tzgf_form.Create( 1,200,0,5,5,0,0,255,255,2 )
End Select
End Function

Function fzgf_update( )
Local _x1:Float, _y1:Float, _x2:Float, _y2:Float, _x3:Float, _y3:Float, _xxpyy:Float, _distance:Double
SetColor 255,255,255
Select point_f



Case 0
DrawText "x1="+azgf_form[0].x , 0 , 120
DrawText "y1="+azgf_form[0].y , 0 , 130
DrawText "x2="+azgf_form[1].x , 0 , 140
DrawText "y2="+azgf_form[1].y , 0 , 150
_x1=azgf_form[1].x-azgf_form[0].x
DrawText "x=x2-x1="+Int(_x1) , 0 , 160
_y1=azgf_form[1].y-azgf_form[0].y
DrawText "y=y2-y1="+Int(_y1) , 0 , 170
DrawText "DISTATION=" , 0 , 180
DrawText " =sqrt(x*x+y*y)=" , 0 , 190
DrawText " =sqrt("+Int(_x1)+"*"+Int(_x1)+"+" , 0 , 200
DrawText " +"+Int(_y1)+"*"+Int(_y1)+")=" , 0 , 210
_xxpyy=_x1*_x1+_y1*_y1
DrawText " =sqrt("+Int(_xxpyy)+")=" , 0 , 220
_distance=Sqr(_xxpyy)
DrawText " ="+_distance , 0 , 230


Case 1
DrawText "x1="+azgf_form[0].x , 0 , 120
DrawText "y1="+azgf_form[0].y , 0 , 130
DrawText "x2="+azgf_form[1].x , 0 , 140
DrawText "y2="+azgf_form[1].y , 0 , 150
_x1=azgf_form[1].x-azgf_form[0].x
DrawText "x=x2-x1="+Int(_x1) , 0 , 160
_y1=azgf_form[1].y-azgf_form[0].y
DrawText "y=y2-y1="+Int(_y1) , 0 , 170
DrawText "DISTATION=" , 0 , 180
DrawText " =sqrt(x*x+y*y)=" , 0 , 190
_xxpyy=_x1*_x1+_y1*_y1
_distance=Sqr(_xxpyy)
DrawText " ="+_distance , 0 , 200
If _distance<>0
azgf_form[2].x=azgf_form[0].x+_x1/_distance*100
azgf_form[2].y=azgf_form[0].y+_y1/_distance*100
DrawText "x3=x1+x/DIST*100=" , 0 , 210
DrawText " ="+azgf_form[2].x , 0 , 220
DrawText "y3=y1+y/DIST*100=" , 0 , 230
DrawText " ="+azgf_form[2].y , 0 , 240
Else
DrawText "DIV TO 0" , 0 , 210
End If
SetLineWidth 5
SetColor 255,255,0
DrawLine azgf_form[0].x,azgf_form[0].y,azgf_form[2].x,azgf_form[2].y
SetLineWidth 1


Case 2
DrawText "x1="+azgf_form[0].x , 0 , 120
DrawText "y1="+azgf_form[0].y , 0 , 130
DrawText "x2="+azgf_form[1].x , 0 , 140
DrawText "y2="+azgf_form[1].y , 0 , 150
DrawText "x3="+azgf_form[2].x , 0 , 160
DrawText "y3="+azgf_form[2].y , 0 , 170
_x1=azgf_form[1].x-azgf_form[0].x
DrawText "x=x2-x1="+Int(_x1) , 0 , 180
_y1=azgf_form[1].y-azgf_form[0].y
DrawText "y=y2-y1="+Int(_y1) , 0 , 190
_x2=azgf_form[0].x-azgf_form[2].x
DrawText "vx=x3-x1="+Int(_x2) , 0 , 200
_y2=azgf_form[0].y-azgf_form[2].y
DrawText "vy=y3-y1="+Int(_y2) , 0 , 210
_xxpyy=Float(_x2*_x1+_y2*_y1)/Float(_x1*_x1+_y1*_y1)
DrawText "coefficient=" , 0 , 220
DrawText " =(vx*_x+_vy*_y)/" , 0 , 230
DrawText " /(x*_x+_y*_y)=" , 0 , 240
DrawText " =("+Int(_x2)+"*"+Int(_x1)+"+" , 0 , 250
DrawText " +"+Int(_y2)+"*"+Int(_y1)+")/" , 0 , 260
DrawText " /("+Int(_x1)+"*"+Int(_x1)+"+" , 0 , 270
DrawText " +"+Int(_y1)+"*"+Int(_y1)+")=" , 0 , 280
DrawText " ="+_xxpyy , 0 , 290
DrawText "x4=x1-coefficient*x=" , 0 , 300
DrawText " ="+(azgf_form[0].x-_xxpyy*_x1) , 0 , 310
DrawText "y4=y1-coefficient*y=" , 0 , 320
DrawText " ="+(azgf_form[0].y-_xxpyy*_y1) , 0 , 330
azgf_form[3].x=azgf_form[0].x-_xxpyy*_x1
azgf_form[3].y=azgf_form[0].y-_xxpyy*_y1
SetLineWidth 3
SetColor 255,0,0
DrawLine azgf_form[0].x,azgf_form[0].y,azgf_form[1].x,azgf_form[1].y
SetColor 0,0,255
DrawLine azgf_form[0].x,azgf_form[0].y,azgf_form[2].x,azgf_form[2].y
SetColor 0,255,0
DrawLine azgf_form[0].x,azgf_form[0].y,azgf_form[3].x,azgf_form[3].y
SetLineWidth 1


Case 3
DrawText "x1="+azgf_form[0].x , 0 , 120
DrawText "y1="+azgf_form[0].y , 0 , 130
DrawText "a1="+azgf_form[0].a , 0 , 140
DrawText "x2="+azgf_form[1].x , 0 , 150
DrawText "y2="+azgf_form[1].y , 0 , 160
DrawText "a2="+azgf_form[1].a , 0 , 170
_x1=Cos(azgf_form[0].a)*azgf_form[0].w
_y1=Sin(azgf_form[0].a)*azgf_form[0].h
_x2=azgf_form[1].x-_x1-azgf_form[0].x
_y2=azgf_form[1].y-_x1-azgf_form[0].y
_xxpyy=_x1*_x1+_y1*_y1
_distance=Sqr(_xxpyy)
_x1=_x1/_distance
_y1=_y1/_distance
DrawText "n1="+_x1 , 0 , 180
DrawText "n1="+_y1 , 0 , 190
_x3=Cos(azgf_form[1].a-azgf_form[0].a+45)*azgf_form[1].w*sqrt2
_y3=Sin(azgf_form[1].a-azgf_form[0].a+45)*azgf_form[1].h*sqrt2
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[2].x=_xxpyy*_x1+azgf_form[0].x
azgf_form[2].y=_xxpyy*_y1+azgf_form[0].y
_x3=-_x3
_y3=-_y3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[3].x=_xxpyy*_x1+azgf_form[0].x
azgf_form[3].y=_xxpyy*_y1+azgf_form[0].y
_xxpyy=_x3
_x3=-_y3
_y3=_x3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[4].x=_xxpyy*_x1+azgf_form[0].x
azgf_form[4].y=_xxpyy*_y1+azgf_form[0].y
_x3=-_x3
_y3=-_y3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[5].x=_xxpyy*_x1+azgf_form[0].x
azgf_form[5].y=_xxpyy*_y1+azgf_form[0].y
SetLineWidth 3
SetColor 255,255,0
DrawLine azgf_form[0].x-_x1*600,azgf_form[0].y-_y1*600,azgf_form[0].x+_x1*600,azgf_form[0].y+_y1*600

_x1=Cos(azgf_form[0].a+90)*azgf_form[0].w
_y1=Sin(azgf_form[0].a+90)*azgf_form[0].h
_x2=azgf_form[1].x-_x1-azgf_form[0].x
_y2=azgf_form[1].y-_x1-azgf_form[0].y
_xxpyy=_x1*_x1+_y1*_y1
_distance=Sqr(_xxpyy)
_x1=_x1/_distance
_y1=_y1/_distance
DrawText "n2="+_x1 , 0 , 200
DrawText "n2="+_y1 , 0 , 210
_x3=Cos(azgf_form[1].a-azgf_form[0].a+45)*azgf_form[1].w*sqrt2
_y3=Sin(azgf_form[1].a-azgf_form[0].a+45)*azgf_form[1].h*sqrt2
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[6].x=_xxpyy*_x1+azgf_form[0].x
azgf_form[6].y=_xxpyy*_y1+azgf_form[0].y
_x3=-_x3
_y3=-_y3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[7].x=_xxpyy*_x1+azgf_form[0].x
azgf_form[7].y=_xxpyy*_y1+azgf_form[0].y
_xxpyy=_x3
_x3=-_y3
_y3=_x3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[8].x=_xxpyy*_x1+azgf_form[0].x
azgf_form[8].y=_xxpyy*_y1+azgf_form[0].y
_x3=-_x3
_y3=-_y3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[9].x=_xxpyy*_x1+azgf_form[0].x
azgf_form[9].y=_xxpyy*_y1+azgf_form[0].y
DrawLine azgf_form[0].x-_x1*600,azgf_form[0].y-_y1*600,azgf_form[0].x+_x1*600,azgf_form[0].y+_y1*600


_x1=Cos(azgf_form[1].a)*azgf_form[1].w
_y1=Sin(azgf_form[1].a)*azgf_form[1].h
_x2=azgf_form[0].x-_x1-azgf_form[1].x
_y2=azgf_form[0].y-_x1-azgf_form[1].y
_xxpyy=_x1*_x1+_y1*_y1
_distance=Sqr(_xxpyy)
_x1=_x1/_distance
_y1=_y1/_distance
DrawText "n1="+_x1 , 0 , 180
DrawText "n1="+_y1 , 0 , 190
_x3=Cos(azgf_form[0].a-azgf_form[1].a+45)*azgf_form[0].w*sqrt2
_y3=Sin(azgf_form[0].a-azgf_form[1].a+45)*azgf_form[0].h*sqrt2
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[10].x=_xxpyy*_x1+azgf_form[1].x
azgf_form[10].y=_xxpyy*_y1+azgf_form[1].y
_x3=-_x3
_y3=-_y3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[11].x=_xxpyy*_x1+azgf_form[1].x
azgf_form[11].y=_xxpyy*_y1+azgf_form[1].y
_xxpyy=_x3
_x3=-_y3
_y3=_x3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[12].x=_xxpyy*_x1+azgf_form[1].x
azgf_form[12].y=_xxpyy*_y1+azgf_form[1].y
_x3=-_x3
_y3=-_y3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[13].x=_xxpyy*_x1+azgf_form[1].x
azgf_form[13].y=_xxpyy*_y1+azgf_form[1].y
SetColor 0,255,255
DrawLine azgf_form[1].x-_x1*600,azgf_form[1].y-_y1*600,azgf_form[1].x+_x1*600,azgf_form[1].y+_y1*600

_x1=Cos(azgf_form[1].a+90)*azgf_form[1].w
_y1=Sin(azgf_form[1].a+90)*azgf_form[1].h
_x2=azgf_form[0].x-_x1-azgf_form[1].x
_y2=azgf_form[0].y-_x1-azgf_form[1].y
_xxpyy=_x1*_x1+_y1*_y1
_distance=Sqr(_xxpyy)
_x1=_x1/_distance
_y1=_y1/_distance
DrawText "n2="+_x1 , 0 , 200
DrawText "n2="+_y1 , 0 , 210
_x3=Cos(azgf_form[0].a-azgf_form[1].a+45)*azgf_form[0].w*sqrt2
_y3=Sin(azgf_form[0].a-azgf_form[1].a+45)*azgf_form[0].h*sqrt2
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[14].x=_xxpyy*_x1+azgf_form[1].x
azgf_form[14].y=_xxpyy*_y1+azgf_form[1].y
_x3=-_x3
_y3=-_y3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[15].x=_xxpyy*_x1+azgf_form[1].x
azgf_form[15].y=_xxpyy*_y1+azgf_form[1].y
_xxpyy=_x3
_x3=-_y3
_y3=_x3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[16].x=_xxpyy*_x1+azgf_form[1].x
azgf_form[16].y=_xxpyy*_y1+azgf_form[1].y
_x3=-_x3
_y3=-_y3
_xxpyy=(_x3+_x2)*_x1+(_y3+_y2)*_y1
azgf_form[17].x=_xxpyy*_x1+azgf_form[1].x
azgf_form[17].y=_xxpyy*_y1+azgf_form[1].y
DrawLine azgf_form[1].x-_x1*600,azgf_form[1].y-_y1*600,azgf_form[1].x+_x1*600,azgf_form[1].y+_y1*600
SetLineWidth 1


End Select
End Function


Данил 08.02.2009 01:44

Ответ: Функции работы с геометрией для игр
 
блин, народ, столько кода, не понятно что к чему, не понял зачем это, посмотрел - пустота в мозгу осталась - собсно хоть кто-то понял что это и для чего и где хотя б применять? оО

при чем столько кода и не единого коммента

dimanche13 08.02.2009 20:50

Ответ: Функции работы с геометрией для игр
 
ну дык это чувак, переписывает на БМ физику, реализованную в небезизвестной игре N. Это гуд, давно хотел заняться написанием статьи по методам нахождения/распознавания/оптимизации коллизий, думаю эти методы тоже пригодились бы. Тока сдается мне, что автор данного варианта, немного накосячил )))) Мельком глянув на статью, понял что у Матвея в колобках было почти тоже самое )))


Часовой пояс GMT +4, время: 00:20.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot