REFSKRIPT

; f_draw.skr
; Zeichnen von Funktionskurven

; Argumente: kurvenname MAX - STEP a [[b] c]

; Interne Variablen
SET_VAR x 0
SET_VAR y 0
SET_VAR t 0.0
SET_VAR tt 0.0

SET_VAR PI 3.14159265359

DIV 180 PI
GET_RESULT conv

; Kurvenname
GET_PARAM_NR 1
GET_RESULT kname

; Schrittweite
GET_PARAM_NR 4
GET_RESULT STEP
; Obere Berechnungsgrenze
GET_PARAM_NR 2
GET_RESULT MAX
; Kurvenparameter
GET_PARAM_NR 5
GET_RESULT a
GET_N_PARAMS
GET_RESULT nparms
IF_LESS_GOTO nparms 6 LBL_PARAMS_EINGELESEN
GET_PARAM_NR 6
GET_RESULT b
IF_LESS_GOTO nparms 7 LBL_PARAMS_EINGELESEN
GET_PARAM_NR 7
GET_RESULT c
>LBL_PARAMS_EINGELESEN:

; Kurvenfunktionen
; Die 3. Funktion (Z) ist nur fuer spaetere Erweiterungen gedacht.
;********************************************************************


IF_STR_EQUAL_GOTO kname trikuspod    LBL_TRIKUSPOID
IF_STR_EQUAL_GOTO kname lissajous    LBL_LISSAJOUS
IF_STR_EQUAL_GOTO kname zykloid      LBL_ZYKLOID
IF_STR_EQUAL_GOTO kname epizykloid   LBL_EPIZYKLOID
IF_STR_EQUAL_GOTO kname hypozykloid  LBL_HYPOZYKLOID
IF_STR_EQUAL_GOTO kname epitrochoid  LBL_EPITROCHOID
IF_STR_EQUAL_GOTO kname hypotrochoid LBL_HYPOTROCHOID
IF_STR_EQUAL_GOTO kname nephroid     LBL_NEPHROID
IF_STR_EQUAL_GOTO kname astroid      LBL_ASTROID

>LBL_TRIKUSPOID:
SET_VAR funcX a*(2*cos(t)+cos(2*t))
SET_VAR funcY a*(2*sin(t)-sin(2*t))
SET_VAR funcZ 0
GOTO LBL_ZEICHNE
>LBL_LISSAJOUS:
MELDUNG Lissajous
SET_VAR funcX sin(a*t+b)
SET_VAR funcY sin(t)
SET_VAR funcZ funcZ 0
GOTO LBL_ZEICHNE
RETURN res
>LBL_ZYKLOID:
SET_VAR funcX (a*tt)-(b*sin(t))
SET_VAR funcY a-(b*cos(t))
SET_VAR funcZ 0
GOTO LBL_ZEICHNE
>LBL_EPIZYKLOID:
SET_VAR funcX (a+b)*cos(t)-(b*cos((a/b+1)*t))
SET_VAR funcY (a+b)*sin(t)-(b*sin((a/b+1)*t))
SET_VAR funcZ 0
GOTO LBL_ZEICHNE
>LBL_HYPOZYKLOID:
SET_VAR funcX (a-b)*cos(t)+(b*cos((a/b-1)*t))
SET_VAR funcY (a-b)*sin(t)-(b*sin((a/b-1)*t))
SET_VAR funcZ 0
GOTO LBL_ZEICHNE
>LBL_EPITROCHOID:
SET_VAR funcX (a+b)*cos(t)-(c*cos((a/b+1)*t))
SET_VAR funcY (a+b)*sin(t)-(c*sin((a/b+1)*t))
SET_VAR funcZ 0
GOTO LBL_ZEICHNE
>LBL_HYPOTROCHOID:
SET_VAR funcX (a-b)*cos(t)+(c*cos((a/b-1)*t))
SET_VAR funcY (a-b)*sin(t)-(c*sin((a/b-1)*t))
SET_VAR funcZ 0
GOTO LBL_ZEICHNE
>LBL_NEPHROID:
SET_VAR funcX a*(3*cos(t)-cos(3*t))
SET_VAR funcY a*(3*sin(t)-sin(3*t))
SET_VAR funcZ 0
GOTO LBL_ZEICHNE
>LBL_ASTROID:
SET_VAR funcX ((cos(t))^3)*a
SET_VAR funcY ((sin(t))^3)*a
SET_VAR funcZ 0
GOTO LBL_ZEICHNE

; Es wurde keine vorhandene Funktion gewaehlt
MELDUNG Kurve kname nicht definiert
RETURN <fehler>

;********************************************************************

>LBL_ZEICHNE:

ADD_STR kname _polygon
GET_RESULT name
OBJ_NEW name 5
GET_RESULT name
>LBL_SCHLEIFE:
; tt um STEP erhoehen
ADD tt STEP
GET_RESULT tt
MUL tt conv
GET_RESULT t
; Koordinaten für den nächsten Punkt berechnen
FUNCTION funcX
GET_RESULT x
FUNCTION funcY
GET_RESULT y
FUNCTION funcZ
GET_RESULT z
; Polygonpunkt erstellen und setzen
GEO_NEW_PT name
GET_RESULT punktnummer
GEO_SET_PT name punktnummer x y z
; Schleife beenden?
IF_GREATER_GOTO MAX tt LBL_SCHLEIFE

RETURN name
