Transform mit winkel

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Iggels
Beiträge: 53
Registriert: 17.02.2006 21:30

Transform mit winkel

Beitrag 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

Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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
Antworten