home *** CD-ROM | disk | FTP | other *** search
-
- #include <windows.h> /* die allgemeinen Windows Definitionen */
-
- #include <string.h>
- #include <math.h>
- #include "cndvarob.h" /* von CONDOR exportierte Typen und Funktionen */
-
- #define pi 3.14159265358
-
- /* Prototypen deklarationen */
- void far pascal wep (int);
- int far pascal varobjinit(long);
- int far pascal defparameter(long link, int id);
- int far pascal paraminit(long link, int id, Parameter *parblock);
- int far pascal paramchange(long link, int id, Parameter *parblock,
- int sit, GeoPoint *hsp);
- int far pascal defhotspots(long link, int id, Parameter *parblock);
- int far pascal enumgeo(long link, int id, Parameter *parblock, int sit);
- int far pascal defsnappoints(long link, int id, Parameter *parblock);
-
- /* die minimale libmain Funktion, die main() Funktion der DLL. Diese Funktion
- wird beim Laden der DLL aufgerufen und kann beliebige Initialisierungen
- beinhalten */
-
- int far pascal libmain(HANDLE hinstance, WORD wdataseg, WORD cbheapsize, LPSTR lpcmdline)
- {
- if (cbheapsize!=0) UnlockData(0);
- return(1);
- }
-
- /* die minimale WEP Funktion, die beim verlassen der DLL aufgerufen wird */
- void far pascal wep (int nparameter)
- {
- return; }
-
-
- /* hier beginnen die Definitionen der Funktionen fⁿr die variablen Elemente */
-
- int far pascal varobjinit(long link)
- /* Die Initialisierung. In dieser Funktion mⁿssen die Namen der variablen
- Elemente aufgezΣhlt werden. CONDOR ruft diese Funktion nur ein einziges
- Mal pro Sitzung auf. Sie kann also auch zur Initialisierung von Variablen
- verwendet werden*/
- {
- CndDefVarObj(link,"gleichseitiges Dreieck",1,VO_MOVE | VO_ROTATE | VO_SIZE | VO_REFLECT | VO_DLG,
- VO_HOTSPOT);
- /* das erste variable Element ist ein gleichseitiges Dreieck, das mit den
- Modifikationen Verschieben, Drehen, Gr÷▀e Σndern und Spiegeln
- verΣndert werden kann, diese Modifikationen aber nicht selbst ausfⁿhrt.
- Es kann Hotspots setzen und darauf reagieren. Es bekommt die
- Identifikationsnummer 1 */
- CndDefVarObj(link,"schiefes Dreieck",2,VO_MOVE | VO_ROTATE | VO_SIZE | VO_REFLECT | VO_DLG,
- VO_MOVE | VO_ROTATE | VO_SIZE | VO_HOTSPOT);
- /* das zweite variable Element ist ein beliegiges Dreieck, das im
- Gegensatz zum ersten die Modifikationen auch selbst ausfⁿhrt. Es bekommt
- die Identifikationsnummer 2 */
- CndDefVarObj(link,"Epizykloide",3,VO_MOVE | VO_ROTATE | VO_SIZE | VO_REFLECT | VO_DLG,
- VO_HOTSPOT);
- /* die Epizykloide ist die Kurve, die entsteht, wenn ein Kreis auf einem
- anderen Kreis abgerollt wird. Ein Punkt auf dem abrollenden Kreis
- hinterlΣ▀t ein Spur. Hier arbeiten wir wieder im Ursprung des
- Koordinatensystems*/
- return(1);
- }
-
- int far pascal defparameter(long link, int id)
- /* die Definition der Parameter. */
- {
- switch (id)
- {
- case 1: /* das gleichseitige Dreieck */
- CndDefParams(link,"SeitenlΣnge",PT_LENGTH);
- CndDefParams(link,"Inkreis",PT_BOOL);
- CndDefParams(link,"Umkreis",PT_BOOL);
- /* das gleichseitige Dreieck hat drei Parameter. Die SeitenlΣnge als
- LΣngenparameter und zwei boolean Parameter, die angeben ob ein
- Inkreis und ein Umkreis dargestellt werden sollen */
- return(1);
- break;
- case 2: /* das schiefe Dreieck */
- CndDefParams(link,"1. Punkt",PT_POINT);
- CndDefParams(link,"2. Punkt",PT_POINT);
- CndDefParams(link,"3. Punkt",PT_POINT);
- CndDefParams(link,"Unterschrift",PT_STRING);
- CndDefParams(link,"Textlage: unterhalb; Mitte; oberhalb",PT_MODE);
- CndDefParams(link,"Textgr÷▀e",PT_LENGTH);
- /* Das schiefe Dreieck hat sechs Parameter: die drei Eckpunkte des
- Dreiecks, einen Text, der zur Beschriftung dienen soll, einen
- "Mode" Parameter, der drei M÷glichkeiten fⁿr die Lage des Textes
- angibt und die Textgr÷▀e. */
- return(1);
- break;
- case 3: /* die Epizykloide */
- CndDefParams(link,"Radius fester Kreis",PT_LENGTH);
- CndDefParams(link,"Radius Rollkreis",PT_LENGTH);
- CndDefParams(link,"Startwinkel",PT_ANGLE);
- CndDefParams(link,"Umlauf",PT_REAL);
- CndDefParams(link,"Ausladung",PT_LENGTH);
- CndDefParams(link,"geschlossen",PT_BOOL);
- CndDefParams(link,"ganzzahlig",PT_BOOL);
- return(1);
- break;
- default: return(0);
- }
- }
-
- int far pascal paraminit(long link, int id, Parameter *parblock)
- /* die Initialisierung der Parameter zur erstmaligen Darstellung
- im Zeichnungsfenster*/
- {
- GeoPoint p1,p2;
- double l,zx,zy;
-
- switch (id) /* welches Element soll initialisiert werden */
- {
- case 1: /* das gleichseitige Dreieck */
- CndGetDisplayExtent(link,&p1,&p2);
- /* wie gro▀ ist der augenblicklich dargestellte
- Ausschnitt der Zeichnung */
- parblock->pararray[0]->UN.volength = (p2.y-p1.y)/4;
- /* die SeitenlΣnge wird ein Viertel der Ausschnitth÷he */
- parblock->pararray[1]->UN.vobool = 0; /* Inkreis nicht darstellen */
- parblock->pararray[2]->UN.vobool = 1; /* Umkreis darstellen */
- /* da das gleichseitige Dreieck sich nicht um die Verschiebung
- kⁿmmert, wird somit von Seiten CONDORs sichergestellt, da▀
- es in der Mitte des Zeichnungsfensters erscheint */
- return(1);
- case 2: /* das schiefe Dreieck */
- CndGetDisplayExtent(link,&p1,&p2);
- /* wie gro▀ ist der augenblicklich dargestellte
- Ausschnitt der Zeichnung */
- l = (p2.y-p1.y)/4; /* ein Viertel der Ausschnittsh÷he */
- zx = (p1.x+p2.x)/2; /* der Mittelpunkt in x */
- zy = (p1.y+p2.y)/2; /* der Mittelpunkt in y */
- parblock->pararray[0]->UN.vopoint.x = zx-l/2;
- parblock->pararray[0]->UN.vopoint.y = zy-l/2;
- /* erster Punkt ist um l/2 links unterhalb des Mittelpunkts */
-
- parblock->pararray[1]->UN.vopoint.x = zx+l/2;
- parblock->pararray[1]->UN.vopoint.y = zy-l/4;
- /* der zweite Punkt etwas rechts unterhalb des Mittelpunkts */
-
- parblock->pararray[2]->UN.vopoint.x = zx+l/4;
- parblock->pararray[2]->UN.vopoint.y = zy+l/2;
- /* der dritte Punkt etwas rechts oberhalb des Mittelpunkts */
-
- parblock->pararray[3]->UN.vostring = (pPString) CndMalloc(link,2+14);
- strcpy(parblock->pararray[3]->UN.vostring->content,"ein Beispiel");
- parblock->pararray[3]->UN.vostring->length = 14;
- /* der Text-Parameter wird mit "ein Beispiel" vorbesetzt */
-
- parblock->pararray[4]->UN.Mode.vomode = 1;
- /* Modus 1, also Text in der Mitte */
- parblock->pararray[5]->UN.volength = l/5;
- return(1);
- case 3:
- CndGetDisplayExtent(link,&p1,&p2);
- l = (p2.y-p1.y)/8; /* ein Achtel der Ausschnittsh÷he */
- parblock->pararray[0]->UN.volength = l;
- parblock->pararray[1]->UN.volength = l;
- parblock->pararray[2]->UN.voangle = 0;
- parblock->pararray[3]->UN.voreal = 2*pi;
- parblock->pararray[4]->UN.volength = 0;
- parblock->pararray[5]->UN.vobool = 1;
- parblock->pararray[6]->UN.vobool = 1;
-
- default: return(0);
- }
- }
-
- int far pascal paramchange(long link, int id, Parameter *parblock,
- int sit, GeoPoint *hsp)
- /* ein Parameter wird verΣndert */
- {
-
- switch (id) /* welches variable Element */
- {
- case 1: /* das gleichseitige Dreieck */
- switch (sit) /* aus welcher Situation erfolgt die ─nderung */
- { /* es sind nur die Hotspots von Interesse und davon auch nur der
- dritte, die anderen beiden werden von CONDOR bereits richtig
- behandelt */
- case -3: parblock->pararray[0]->UN.volength = fabs(hsp->x);
- /* es war der dritte Hotspot, der fⁿr die SeitenlΣnge
- zustΣndig sein soll. Die SeitenlΣnge wird hier als der
- horizontale Abstand des Hotspot vom Nullpunkt bestimmt */
- return(1);
- default: return(1);
- };
- return(1);
- case 2: /* das schiefe Dreieck */
- switch (sit) /* die Situation */
- { /* auch hier sind nur dei Hotspots von Interesse, die in diesem Fall
- mit den drei Punkten identisch sind */
- case -2: parblock->pararray[0]->UN.vopoint = *hsp;
- return(1);
- case -3: parblock->pararray[1]->UN.vopoint = *hsp;
- return(1);
- case -4: parblock->pararray[2]->UN.vopoint = *hsp;
- return(1);
- default: return(1);
- }
- case 3: /* Epizykloide */
- switch (sit) /* die Situation */
- {
- case -2: /* der Hotspot fⁿr den Festkreisradius wird geΣndert */
- parblock->pararray[0]->UN.volength = hsp->x;
- case 1: /* Festkreisradius wurde in der Dialogbox geΣndert */
- if (parblock->pararray[5]->UN.vobool!=0) /* geschlossen */
- { parblock->pararray[3]->UN.voreal =
- (parblock->pararray[0]->UN.volength)/
- (parblock->pararray[1]->UN.volength)*2*pi;
- }
- return(1);
- case -3: parblock->pararray[1]->UN.volength = hsp->x-parblock->pararray[0]->UN.volength;
- case 2: /* Rollkreisradius wurde geΣndert */
- if (parblock->pararray[5]->UN.vobool!=0) /* geschlossen */
- { parblock->pararray[3]->UN.voreal =
- (parblock->pararray[0]->UN.volength)/
- (parblock->pararray[1]->UN.volength)*2*pi;
- }
- return(1);
- default: return(1);
- }
- default: return(0);
- }
- }
-
- int far pascal defhotspots(long link, int id, Parameter *parblock)
- /* Festlegen von Lage und Typ der Hotspots */
- {
- GeoPoint p1;
- double l;
-
- switch (id) /* welches Element */
- {
- case 1: /* gleichseitiges Dreieck */
- /* alle Koordinaten beziehen sich auf den Nullpunkt als eine
- Ecke des Dreiecks. Verschieben und Drehen wird von CONDOR
- abgehandelt */
- p1.x = 0;
- p1.y = 0;
- l = parblock->pararray[0]->UN.volength; /* die SeitenlΣnge */
- CndDefHotSpot(link,&p1,CUR_MOVE,"verschieben"); /* verschieben */
- /* der Nullpunkt dient als Hotspot zum Verschieben. */
-
- p1.x = l/2;
- CndDefHotSpot(link,&p1,CUR_ROT,"drehen"); /* drehen */
- /* der Mittelpunkt der Grundlinie dient als Hotspot zum Drehen */
-
- p1.x = l;
- CndDefHotSpot(link,&p1,CUR_POINT,"SeitenlΣnge"); /* Punktcursor */
- /* das rechte Ende der Grundlinie dient als Hotspot zum ─ndern
- der SeitenlΣnge */
- return(1);
- case 2: /* das schiefe Dreieck */
- p1.x = (parblock->pararray[0]->UN.vopoint.x+
- parblock->pararray[1]->UN.vopoint.x+
- parblock->pararray[2]->UN.vopoint.x)/3;
- p1.y = (parblock->pararray[0]->UN.vopoint.y+
- parblock->pararray[1]->UN.vopoint.y+
- parblock->pararray[2]->UN.vopoint.y)/3;
- /* der Mittelpunkt des Dreiecks (Schwerpunkt ) */
- CndDefHotSpot(link,&p1,CUR_MOVE,"verschieben");
- /* der Mittelpunkt dient als Hotspot zum Verschieben */
-
- CndDefHotSpot(link,&parblock->pararray[0]->UN.vopoint,CUR_POINT,"1. Punkt");
- CndDefHotSpot(link,&parblock->pararray[1]->UN.vopoint,CUR_POINT,"2. Punkt");
- CndDefHotSpot(link,&parblock->pararray[2]->UN.vopoint,CUR_POINT,"3. Punkt");
- /* die drei Eckpunkte bekommen jeweils einen Hotspot, mit dem
- eben diese Eckpunkte verΣndert werden k÷nnen */
- return(1);
- case 3: /* die Epizykloide */
- p1.x = 0;
- p1.y = 0;
- CndDefHotSpot(link,&p1,CUR_MOVE,"verschieben"); /* verschieben */
- p1.x = parblock->pararray[0]->UN.volength;
- CndDefHotSpot(link,&p1,CUR_POINT,"Festkreis"); /* Punktcursor */
- p1.x = parblock->pararray[0]->UN.volength+
- parblock->pararray[1]->UN.volength;
- CndDefHotSpot(link,&p1,CUR_POINT,"Rollkreis"); /* Punktcursor */
- default: return(0);
- }
- }
-
- int far pascal enumgeo(long link, int id, Parameter *parblock, int sit)
- /* Definition der Geometrie */
- {
- GeoPoint mpkt,p1,p2,p3,p4;
- double l,h,r1,r2,a,b,c,d,delta;
- int n,i,pos,anz;
- Attribut atrundef = {255,255,255,255}; /* dieses Attribut ist das in
- CONDOR voreingestellte Attribut */
- Attribut atr;
-
- switch (id) /* welches Element */
- {
- case 1: /* das gleichseitige Dreieck */
- l = parblock->pararray[0]->UN.volength; /* die SeitenlΣnge */
- h = l*sqrt(3)/2; /* die H÷he des Dreiecks */
- p1.x = 0;
- p1.y = 0;
- p2.x = l;
- p2.y = 0;
- p3.x = l/2;
- p3.y = h;
- p4.x = l/2;
- p4.y = 0;
- /* die drei Eckpunkte und der Mittelpunkt der Grundlinie */
-
- atr = atrundef;
- if (CndLine(link,&p1,&p2,atrundef)==0) return(0);
- if (CndLine(link,&p2,&p3,atrundef)==0) return(0);
- if (CndLine(link,&p3,&p1,atrundef)==0) return(0);
- /* definiere die drei Seiten des Dreiecks als Linien. Wenn CndLine
- 0 liefert, dann soll nicht mehr weiterdefiniert werden. Das ist
- z.B. dann der Fall, wenn beim Anpicken bereits eine Linie
- getroffen wurde, dann iste es nichtmehr n÷tig die restlichen
- Linien zu berechnen */
- r1 = l/2*sqrt(3)/3; /* Radius des Inkreises */
- r2 = r1*2; /* Radius des Umkreises */
- mpkt.x = l/2;
- mpkt.y = r1; /* Mittelpunkt der beiden Kreise */
- atr.color = 2; /* der Inkreis soll mit Farbe 2 gezeichnet werden */
- if (parblock->pararray[1]->UN.vobool != 0) /* soll der Inkreis gezeichnet werden */
- {if (CndCircle(link,&mpkt,r1,atr)==0) return(0);};
-
- atr.color = 3; /* der Umkreis soll mit Farbe 3 gezeichnet werden */
- if (parblock->pararray[2]->UN.vobool != 0) /* soll der Umkreis gezeichnet werden */
- {if (CndCircle(link,&mpkt,r2,atr)==0) return(0);};
- return(1);
- case 2: /* das schiefe Dreieck */
- CndLine(link,&parblock->pararray[0]->UN.vopoint,
- &parblock->pararray[1]->UN.vopoint,atrundef);
- CndLine(link,&parblock->pararray[1]->UN.vopoint,
- &parblock->pararray[2]->UN.vopoint,atrundef);
- CndLine(link,&parblock->pararray[2]->UN.vopoint,
- &parblock->pararray[0]->UN.vopoint,atrundef);
- /* ganz einfach die drei Seitenlinien aus den drei Eckpunkten
- bestimmen. Der Ergebniswert von CndLine bleibt hier unberⁿcksichtigt,
- was fⁿr CONDOR evtl. Zeitverluste bedeutet, bei drei Linien
- spielt das aber keine Rolle */
-
- i = parblock->pararray[3]->UN.vostring->length;
- parblock->pararray[3]->UN.vostring->content[i] = 0;
- /* den Pascal-String mit einer 0 am Ende versehen */
- p1.x = (parblock->pararray[0]->UN.vopoint.x +
- parblock->pararray[1]->UN.vopoint.x +
- parblock->pararray[2]->UN.vopoint.x ) / 3;
- /* Mittelpunkt in x */
- switch (parblock->pararray[4]->UN.Mode.vomode)
- /* wo soll der Text erscheinen */
- {
- case 0:/* unten */
- p1.y = min(min(parblock->pararray[0]->UN.vopoint.y,
- parblock->pararray[1]->UN.vopoint.y),
- parblock->pararray[2]->UN.vopoint.y);
- pos = TXT_TOP;
- break;
- case 1: /* Mitte */
- p1.y = (parblock->pararray[0]->UN.vopoint.y +
- parblock->pararray[1]->UN.vopoint.y +
- parblock->pararray[2]->UN.vopoint.y ) / 3;
- pos = TXT_V_CENT;
- break;
-
- case 2: /* oben */
- p1.y = max(max(parblock->pararray[0]->UN.vopoint.y,
- parblock->pararray[1]->UN.vopoint.y),
- parblock->pararray[2]->UN.vopoint.y);
- pos = TXT_BOTTOM;
- /* oben */
- break;
- }
- atr = atrundef;
- atr.color = 4;
- pos = pos | TXT_H_CENT; /* die Zentrierung des Textes */
- CndText(link,&p1,parblock->pararray[3]->UN.vostring->content,
- (Pointer)0,parblock->pararray[5]->UN.volength,0,pos,atr);
- /* definiert einen Text am Punkt p1. Der Text selbst ist
- identisch mit dem 4. Parameter, es wird der voreingestellte
- Zeichensatz verwendet, die Gr÷▀e ergibt sich aus dem
- 6. Parameter, der Text ist horizontal, die Zentrierung ergibt
- sich aus dem "Mode" Parameter, Farbe ist 4 */
- CndGetTextExtent(link,&p1,parblock->pararray[3]->UN.vostring->content,
- (Pointer)0,parblock->pararray[5]->UN.volength,0,pos,
- &p1,&p2,&p3,&p4);
- CndLine(link,&p1,&p2,atrundef);
- CndLine(link,&p2,&p3,atrundef);
- CndLine(link,&p3,&p4,atrundef);
- CndLine(link,&p4,&p1,atrundef);
- return(1);
- case 3: /* die Epizykloide */
- anz = 100;
- if (sit==SIT_DRAW) anz=200;
- if (sit==SIT_PLOT) anz=400;
- /* anz ist die Anzahl der Linien, die gezeichnet werden sollen */
-
- a = parblock->pararray[0]->UN.volength; /* Radius Festkreis */
- if (parblock->pararray[6]->UN.vobool!=0) /* ganzzahlig */
- /* wenn ganzzahlig eingestellt ist, dann soll der Roolkreisradius
- ganz im Festkreisradius enthalten sein */
- { n = (int) (parblock->pararray[0]->UN.volength/
- parblock->pararray[1]->UN.volength);
- b = parblock->pararray[0]->UN.volength/max(n,1);
- }
- else
- b = parblock->pararray[1]->UN.volength; /* Radius Rollkreis */
- c = b+parblock->pararray[4]->UN.volength; /* VerlΣngerung */
- if (parblock->pararray[5]->UN.vobool!=0) /* geschlossen */
- /* wenn geschlossen eingestellt ist, dann soll der Rollkreis
- genau einmal auf dem Festkreis abrollen */
- d = (parblock->pararray[0]->UN.volength)/b*2*pi;
- else
- d = parblock->pararray[3]->UN.voreal;
-
- delta = ( d - parblock->pararray[2]->UN.voangle) /anz; /* Schrittweite */
-
- p1.x = 0;
- p1.y = 0;
- atr = atrundef;
- switch (sit)
- /* wenn gerade die beiden Hotspots verzogen werden, d.h. die
- Maustaste ist gedrⁿckt, dann wird zusΣtzlich zu Epizykloide
- noch der Kreis gezeichnet, dessen Radius mit diesem Hotspot
- gerade verΣndert wird. Wird die Maustaste wieder losgelassen,
- dann wird wiedr nur die Epizykloide gezeichnet */
- {
- case -2: /* der Radius des Festkreises wird verΣndert */
- atr.color = 0; /* graue Farbe, dient nur zum zeichnen beim
- aktuellen Element */
- atr.linepattern = 1; /* durchgezogen */
- CndCircle(link,&p1,parblock->pararray[0]->UN.volength,atr);
- p1.x = parblock->pararray[0]->UN.volength +
- parblock->pararray[1]->UN.volength;
- atr.linepattern = 3; /* gepunktet */
- CndCircle(link,&p1,parblock->pararray[1]->UN.volength,atr);
- /* der Festkreis also grau und durchgezogenen Linien, der
- Rollkreis gepunktet */
- break;
- case -3:
- atr.color = 0; /* graue Farbe, dient nur zum zeichnen beim
- aktuellen Element */
- atr.linepattern = 3; /* gepunktet */
- CndCircle(link,&p1,parblock->pararray[0]->UN.volength,atr);
- p1.x = parblock->pararray[0]->UN.volength +
- parblock->pararray[1]->UN.volength;
- atr.linepattern = 1; /* durchgezogen */
- CndCircle(link,&p1,parblock->pararray[1]->UN.volength,atr);
- break;
- default: {};
- /* in allen anderen FΣllen werden keine zusΣtzlichen Kreise gezeichnet */
- }
- p1.x = (a+b)*cos(b/a*parblock->pararray[2]->UN.voangle)-
- c*cos((a+b)/a*parblock->pararray[2]->UN.voangle);
- p1.y = (a+b)*sin(b/a*parblock->pararray[2]->UN.voangle)-
- c*sin((a+b)/a*parblock->pararray[2]->UN.voangle);
- /* p1 ist der Anfangspunkt der Epizykloide, wird in der Schleife
- jeweils auf den Endpunkt der gezeichneten Linie gelegt */
- for (i=1; i<=anz; i++)
- /* in dieser Schleife werden die Punkte der Epizykloide berechnet
- und lauter kleine Linienstⁿcke definiert */
- {
- p2.x = (a+b)*cos(b/a*(parblock->pararray[2]->UN.voangle+i*delta))-
- c*cos((a+b)/a*(parblock->pararray[2]->UN.voangle+i*delta));
- p2.y = (a+b)*sin(b/a*(parblock->pararray[2]->UN.voangle+i*delta))-
- c*sin((a+b)/a*(parblock->pararray[2]->UN.voangle+i*delta));
- if (CndLine(link,&p1,&p2,atrundef)==0) return(0);
- /* definiert ein kleines Linienstⁿck der Kurve. In diesem Fall ist
- es wichtig, den Rⁿckgabewert von CndLine zu beachten und im Falle 0
- die Procedure zu beenden, da sonst CONDOR-Funktionen verlangsamt
- werden k÷nnten */
- p1 = p2; /* der alte Endpunkt wird zum neuen Anfangspunkt */
- }
- /* es wΣre auch m÷glich mit CndPolyline zuerst alle Punkte zu
- berechnen und auf einem Array zwischenzuspeichern. Der Vorteil
- wΣre, da▀ beim Trimmen das ganze Teilstⁿck abgeschnitten wird,
- der Nachteil, da▀ beim dynamischen Zeichnen zunΣchst alles
- berechnet wird, und dann keine Zeit mehr fⁿr die Darstellung
- bleibt, der Anwender also nur das erste Teilstrichlein zu
- sehen bekommt. Ganz komfartabel wΣre die Unterscheidung der
- beiden FΣlle anhand von st */
- default:return(0);
- }
- }
-
- int far pascal defsnappoints(long link, int id, Parameter *parblock)
- /* Definition der Fangpunkte */
- {
- GeoPoint p1;
- double l,h;
-
- switch (id) /* welches Element */
- {
- case 1: /* das gleichseitige Dreieck */
- l = parblock->pararray[0]->UN.volength;
- h = l*sqrt(3)/2;
- p1.x = 0;
- p1.y = 0;
- CndDefSnapPoint(link,&p1);
- p1.x = l;
- p1.y = 0;
- CndDefSnapPoint(link,&p1);
- p1.x = l/2;
- p1.y = h;
- CndDefSnapPoint(link,&p1);
- /* die drei Fangpunkte sind die drei Eckpunkte. Zur Berechnung
- siehe enumgeo */
- return(1);
- case 2: /* das schiefe Dreieck */
- CndDefSnapPoint(link,&parblock->pararray[0]->UN.vopoint);
- CndDefSnapPoint(link,&parblock->pararray[1]->UN.vopoint);
- CndDefSnapPoint(link,&parblock->pararray[2]->UN.vopoint);
- /* die Fangpunkte sind die drei Eckpunkte */
- return(1);
- case 3: /* die Epizykloide */
- p1.x = 0;
- p1.y = 0;
- CndDefSnapPoint(link,&p1);
- /* nur der Mittelpunkt ist Fangpunkt */
- return(1);
- default: return(0);
- }
- }
-
-