Seite 1 von 1

Transform mit winkel

Verfasst: 22.02.2006 20:43
von Iggels
Hier der Code:

Code: Alles auswählen



 Procedure TransformSpriteAngle(picid3d,angle.f,x1.f,y1.f,x2.f,y2.f,x3.f,y3.f,x4.f,y4.f) 
    
    If angle <> 0
      
      middlex.f = (x1+x2+x3+x4)/4
      middley.f = (y1+y2+y3+y4)/4
      
      
      difx.f = middlex-x1
      dify.f = middley-y1
      
      
      len.f = Sqr(Pow(difx,2)+Pow(dify,2))
      angleplus.f = Vec_angle(difx,dify)
      
      x1.f = middlex-Cos(ConvertAngle(angleplus+angle))*len
      y1.f = middley-Sin(ConvertAngle(angleplus+angle))*len
      
      
      difx.f = middlex-x2
      dify.f = middley-y2
      
      len.f = Sqr(Pow(difx,2)+Pow(dify,2))
      
      angleplus.f = Vec_angle(difx.f,dify.f)
      
      
      x2.f = middlex-Cos(ConvertAngle(angleplus+angle))*len
      y2.f = middley-Sin(ConvertAngle(angleplus+angle))*len
      
      
      difx = middlex-x3
      dify = middley-y3
      
      len.f = Sqr(Pow(difx,2)+Pow(dify,2))
      angleplus.f = Vec_angle(difx.f,dify.f)
      
      x3.f = middlex-Cos(ConvertAngle(angleplus+angle))*len
      y3.f = middley-Sin(ConvertAngle(angleplus+angle))*len
      
      difx = middlex-x4
      dify = middley-y4
      
      len.f = Sqr(Pow(difx,2)+Pow(dify,2))
      angleplus.f = Vec_angle(difx.f,dify.f)
      
      x4.f = middlex-Cos(ConvertAngle(angleplus+angle))*len
      y4.f = middley-Sin(ConvertAngle(angleplus+angle))*len
      
      
    EndIf
    
    TransformSprite3D(picid3d,x1,y1,x2,y2,x3,y3,x4,y4)
    
  EndProcedure


Verfasst: 23.02.2006 11:06
von NicTheQuick
Hab das ganze noch etwas optimiert und die zwei fehlenden Funktionen
[c]Vec_angle()[/c] und [c]ConvertAngle()[/c] eingebaut bzw. ersetzt.

Code: Alles auswählen

Procedure.f Vec_angle(y.f, x.f)
  ! fld dword [esp]
  ! fld dword [esp + 4]
  ! fpatan
  ! ftst
  ! fstsw ax
  ! sahf
  ! jae @@skip
  ! fldpi
  ! fadd st1, st0
  ! faddp st1, st0
  ! @@skip:
EndProcedure

Procedure TransformSpriteAngle(picid3d.l, angle.f, x1.f, y1.f, x2.f, y2.f, x3.f, y3.f, x4.f, y4.f)
  Protected middlex.f, middley.f, len.f, angleplus.f, difx.f, dify.f

  If angle <> 0
    angle * 3.14159265 / 180

    middlex = (x1 + x2 + x3 + x4) / 4
    middley = (y1 + y2 + y3 + y4) / 4


    difx = middlex - x1
    dify = middley - y1

    len = Sqr(difx * difx + dify * dify)
    angleplus = Vec_angle(dify, difx)

    x1 = middlex - Cos(angleplus + angle) * len
    y1 = middley - Sin(angleplus + angle) * len


    difx = middlex - x2
    dify = middley - y2

    len = Sqr(difx * difx + dify * dify)
    angleplus = Vec_angle(dify, difx)

    x2 = middlex - Cos(angleplus + angle) * len
    y2 = middley - Sin(angleplus + angle) * len


    difx = middlex - x3
    dify = middley - y3

    len = Sqr(difx * difx + dify * dify)
    angleplus = Vec_angle(dify, difx)

    x3 = middlex - Cos(angleplus + angle) * len
    y3 = middley - Sin(angleplus + angle) * len


    difx = middlex - x4
    dify = middley - y4

    len = Sqr(difx * difx + dify * dify)
    angleplus = Vec_angle(dify, difx)

    x4 = middlex - Cos(angleplus + angle) * len
    y4 = middley - Sin(angleplus + angle) * len
  EndIf

  TransformSprite3D(picid3d, x1, y1, x2, y2, x3, y3, x4, y4)
EndProcedure