I'm trying to make a circle that has a center in origo. I make this in the GDL programming language. But the problem is actually related to trigonometry.

So I need some help from clever matematics people.

Se the illustration below.

I first put the circle on the horizontal layer (XY-layer and z=0). Center is origo (x=y=z=0)

That works fine.

I tilt the circle with an angle to the horizontal layer. I call this angleXY.

The circle cuts through the horizontal layer in the X-axis. The circle is tiltet counter-clockwise. This also works fine.

But the problem occures when I try to rotate the tilted circle counterclockwise around the z-axis. The angle is vinkeXZ. I can't figure out how to calculate the x-coordinates.

Here is the code (vinkel = angle)

fromDegrees = 10

toDegrees = 360

stepDegrees = 10

centerX = 0

centerY = 0

centerZ = 0

radiusP = 0.5

vinkelXZ = 45 ! Angle from the X-axis counterclockwise around the Z-axis (centerX and centerY=0)

vinkelXY = 45 ! Angle between the horizontal-layer and the circle.

! Counterclockwise around the X-axis (centerY=0)

angle = 0

GOSUB "GenerateCircularCoordinates"

END

"GenerateCircularCoordinates":

! This routine calculates xyz-coordinates to a circle that tilts against the horizontal-layer

! and rotates around the Z-axis

!

! Calculate the trigonometric factores to angles that do not change in the loop.

sinVinkelXY = SIN(vinkelXY)

cosVinkelXY = COS(vinkelXY)

sinVinkelXZ = SIN(vinkelXZ)

cosVinkelXZ = COS(vinkelXZ)

FOR vinkel = fromDegrees TO toDegrees STEP stepDegrees

deltaX = radiusP * COS (vinkel)

deltaY = radiusP * SIN (vinkel)

deltaZ = radiusP * SIN (vinkel)

x = centerX - deltaX

y = centerY - deltaY

z = centerZ

! ---------------------------------------------------

! Tilt against the horizontal-layer (XY-layer)

! Rotation around the X-axis

!

z = -y * sinVinkelXY + centerZ

y = y * cosVinkelXY + centerY

! ---------------------------------------------------

! Rotation around the Z-axis

!

y = y + x*sinVinkelXZ

x = x*cosVinkelXZ

!

! PUT x, y, z, angle

IF vinkel <> 0 THEN

ADD x, y, z

TEXT 0.005, 0, vinkel

DEL 1

LIN_ x - 0.01, y - 0.01, z - 0.01, x + 0.01, y + 0.01, z + 0.01

!ENDIF

NEXT vinkel

RETURN