Develop and Download Open Source Software

Browse Subversion Repository

Contents of /draw.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (show annotations) (download) (as text)
Mon Nov 7 12:03:00 2011 UTC (12 years, 4 months ago) by shiraishikazuo
File MIME type: text/x-pascal
File size: 15590 byte(s)


1 unit draw;
2 {$IFDEF FPC}
3 {$MODE DELPHI}{$H+}
4 {$ENDIF}
5 (***************************************)
6 (* Copyright (C) 2009, SHIRAISHI Kazuo *)
7 (***************************************)
8
9 {$X+}
10
11 interface
12 uses affine,objlist,variabl,express;
13
14 type
15 TTransformTerm=class
16 //procedure exec(p:Taffine);virtual;abstract;
17 function Code:Ansistring;virtual;abstract;
18 end;
19
20 type
21 TTransFormList=class(TObjectList)
22 //procedure make(a:Taffine);
23 function Code1:ansistring;
24 function Code2:ansistring;
25 function Code0(m:TMatrix):AnsiString; // for TransForm-mat statement
26 end;
27
28
29 function transformation:TTransformList;
30
31
32 implementation
33
34 uses Types, SysUtils,Graphics,
35 arithmet, base,base0,float,mathc, texthand,
36 graphic,struct,confopt,helpctex,plottext,sconsts,graphsys,gridaxes;
37
38 (*
39 procedure TTransFormList.make(a:TAffine);
40 var
41 i:integer;
42 p:TTransformTerm;
43 begin
44 i:=0;
45 while (i<count) do
46 begin
47 TObject(p):=items[i];
48 p.exec(a);
49 inc(i)
50 end;
51 end;
52 *)
53
54 type
55 TTransformMatrix=class(TTransformTerm)
56 mat:TMatrix;
57 constructor create;
58 //procedure exec(p:Taffine);override;
59 destructor destroy;override;
60 function Code:ansistring;override;
61 end;
62
63 TTransformFunction=class(TTransformTerm)
64 exp1,exp2:TPrincipal;
65 destructor destroy;override;
66 function Code:ansistring;override;
67 end;
68
69 TSHIFT=class(TTransformFunction)
70 constructor create;
71 //procedure exec(p:Taffine);override;
72 function Code:ansistring;override;
73 end;
74
75 TSCALE=class(TTransformFunction)
76 constructor create(e1:TPrincipal);
77 //function Code:ansistring;override;
78 end;
79
80 TSCALE1=class(TSCALE)
81 //procedure exec(p:Taffine);override;
82 function Code:ansistring;override;
83 end;
84
85 TSCALEC=class(TSCALE)
86 //procedure exec(p:Taffine);override;
87 function Code:ansistring;override;
88 end;
89
90 TSCALE2=class(TSCALE)
91 constructor create(e1:TPrincipal);
92 //procedure exec(p:Taffine);override;
93 function Code:ansistring;override;
94 end;
95
96 TROTATE=class(TTransformFunction)
97 rad:extended;
98 cost,sint:extended;
99 constructor create;
100 //procedure exec(p:Taffine);override;
101 function Code:ansistring;override;
102 end;
103
104 TSHEAR=class(TTransformFunction)
105 rad:extended;
106 constructor create;
107 //procedure exec(p:Taffine);override;
108 function Code:ansistring;override;
109 end;
110
111
112 TcurrentTransform=class(TTransformFunction)
113 //procedure exec(p:Taffine);override;
114 function Code:ansistring;override;
115 end;
116
117
118 type
119 ESyntaxError=class(Exception);
120
121 constructor TTransformMatrix.create;
122 begin
123 inherited create;
124 mat:=NMatrix;
125 if mat=nil then raise ESyntaxError.create('');
126 if mat.idr.dim<>2 then begin seterrdimension(IDH_PICTURE);raise ESyntaxError.create('') end
127 end;
128
129
130 constructor TSHIFT.create;
131 begin
132 inherited create;
133 gettoken; { keyword }
134 gettoken; { '(' }
135 exp1:=NExpression;
136 if (ProgramUnit.arithmetic=PrecisionComplex) and (token<>',') then exit;
137 check(',',IDH_PICTURE);
138 exp2:=NExpression;
139 end;
140
141 constructor TSCALE.create(e1:TPrincipal);
142 begin
143 inherited create;
144 exp1:=e1;
145 end;
146
147 constructor TSCALE2.create(e1:TPrincipal);
148 begin
149 inherited create(e1);
150 gettoken;
151 exp2:=NExpression;
152 end;
153
154
155 function scale:TSCALE;
156 var
157 exp1:TPrincipal;
158 begin
159 gettoken; { keyword }
160 gettoken; { '(' }
161 exp1:=NExpression;
162 if token=',' then
163 result:=TSCALE2.create(exp1)
164 else if ProgramUnit.arithmetic=PrecisionComplex then
165 result:=TSCALEC.create(exp1)
166 else
167 result:=TSCALE1.create(exp1)
168 end;
169
170 constructor TROTATE.create;
171 var
172 x:extended;
173 begin
174 inherited create;
175 gettoken; { keyword }
176 gettoken; { '(' }
177 exp1:=NExpression;
178 if confirmedDegrees then
179 rad:=pi/180
180 else
181 rad:=1;
182 if (exp1=nil) then begin raise ESyntaxError.create('') end;
183 if (exp1.isConstant) then
184 begin
185 x:=exp1.evalX;
186 cost:=cos(x*rad);
187 sint:=sin(x*rad);
188 exp1.free;
189 exp1:=nil;
190 end;
191 end;
192
193 constructor TShear.create;
194 begin
195 inherited create;
196 gettoken; { keyword }
197 gettoken; { '(' }
198 exp1:=NExpression;
199 if confirmedDegrees then
200 rad:=pi/180
201 else
202 rad:=1;
203 if (exp1=nil) then
204 begin raise ESyntaxError.create('') end;
205 end;
206
207 destructor TTransformmatrix.destroy;
208 begin
209 mat.free;
210 inherited destroy;
211 end;
212
213 destructor TTransformFunction.destroy;
214 begin
215 exp1.free;
216 exp2.free;
217 inherited destroy;
218 end;
219 (*
220 procedure TSHIFT.exec(p:Taffine);
221 var
222 c:complex;
223 begin
224 if (exp2=nil) then
225 begin
226 exp1.evalC(c);
227 p.shift(c.x, c.y)
228 end
229 else
230 p.shift(exp1.evalX,exp2.evalX) ;
231 end;
232
233 procedure TSCALE1.exec(p:TAffine);
234 begin
235 p.scale1(exp1.evalX) ;
236 end;
237
238 procedure TSCALE2.exec(p:TAffine);
239 begin
240 p.scale(exp1.evalX,exp2.evalX)
241 end;
242
243 procedure TSCALEC.exec(p:TAffine);
244 var
245 c:complex;
246 begin
247 exp1.evalC(c);
248 p.cmlt(c)
249 end;
250
251
252 procedure TROTATE.exec(p:TAffine);
253 begin
254 if exp1=nil then
255 p.rotate2(cost,sint)
256 else
257 p.rotate(exp1.evalX*rad)
258 end;
259
260 procedure TSHEAR.exec(p:TAffine);
261 begin
262 p.shear(exp1.evalX * rad)
263 end;
264
265
266 procedure TTRansformMatrix.exec(p:Taffine);
267 var
268 NArray:TArray;
269 m:TAffine;
270 begin
271 NArray:=TArray(mat.point);
272 if (NArray<>nil) and (NArray.dim=2)
273 and (NArray.size[1]=4) and (NArray.size[2]=4) then
274 begin
275 m:=TAffine.create;
276 try
277 with NArray do
278 try
279 ItemGetF(0, m.xx);
280 ItemGetF(1*size[2], m.xy);
281 ItemGetF(2*size[2], m.xz);
282 ItemGetF(3*size[2], m.xo);
283 ItemGetF( 1,m.yx);
284 ItemGetF(1*size[2]+1,m.yy);
285 ItemGetF(2*size[2]+1,m.yz);
286 ItemGetF(3*size[2]+1,m.yo);
287 ItemGetF( 2,m.zx);
288 ItemGetF(1*size[2]+2,m.zy);
289 ItemGetF(2*size[2]+2,m.zz);
290 ItemGetF(3*size[2]+2,m.zo);
291 ItemGetF( 3,m.ox);
292 ItemGetF(1*size[2]+3,m.oy);
293 ItemGetF(2*size[2]+3,m.oz);
294 ItemGetF(3*size[2]+3,m.oo);
295 except
296 setexception(-3009)
297 end;
298 p.mlt(m);
299 finally
300 m.free;
301 end;
302 end
303 else
304 setexception(6201);
305 end;
306
307
308 procedure TCurrentTransform.exec(p:Taffine);
309 begin
310 if CurrentTransform<>nil then p.mlt(currenttransform);
311 end;
312 *)
313
314
315 type
316 TDRAW=class(TCALL)
317 transform:TTransformList; {collection of PTransformterm }
318 substitution: function(x,y:extended):boolean; {AXES,GRID}
319 exp1,exp2:TPrincipal;
320 NoBeamOff:boolean;
321 constructor create(prev,eld:TStatement);
322 destructor destroy;override;
323 // procedure exec;override;
324 function OverflowErCode:integer;override;
325 function InvalidErCode:integer;override;
326 function OpName:string;override;
327 {for Code Gen.}
328 function Code:AnsiString;override;
329
330
331 end;
332
333 function DRAWst(prev,eld:TStatement):TStatement;far;
334 begin
335 DRAWst:=TDRAW.create(prev,eld{,idr});
336 graphmode:=true;
337 end;
338
339 function transformation:TTransformList;
340 var
341 p:TTransformTerm;
342 s:boolean;
343 begin
344 result:=TTransformList.create(4);
345 try
346 s:=true;
347 repeat
348 p:=nil;
349 if nexttoken='(' then
350 begin
351 if token='SHIFT' then
352 p:=TSHIFT.create
353 else if token='SCALE' then
354 p:=scale
355 else if token='ROTATE' then
356 p:=TROTATE.create
357 else if token='SHEAR' then
358 p:=TSHEAR.create
359 else
360 seterrillegal(token,IDH_PICTURE);
361 check(')',IDH_PICTURE);
362 end
363 else if token='TRANSFORM' then
364 begin
365 gettoken;
366 p:=TCurrentTransform.create
367 end
368 else
369 p:=TTransformMatrix.create;
370 if p<>nil then result.add(p);
371 if token='*' then
372 gettoken
373 else
374 s:=false;
375 until s=false;
376 except
377 on syntaxError do
378 begin
379 result.free;
380 result:=nil;
381 end;
382 end;
383 end;
384
385 constructor TDRAW.create(prev,eld:TStatement);
386 begin
387 transform:=nil;
388
389 try
390 inherited create(prev,eld,'P')
391 except
392 on SyntaxError do
393 begin
394 inherited TStatementCreate(prev,eld);
395 {reseterr; }
396 if token='AXES0' then
397 substitution:=drawaxes0
398 else if token='GRID0' then
399 substitution:=drawgrid0
400 else if token='AXES' then
401 substitution:=drawaxes2
402 else if token='GRID' then
403 substitution:=drawgrid2
404 else if token='CIRCLE' then
405 substitution:=drawcircle
406 else if token='DISK' then
407 begin
408 substitution:=drawdisk;
409 NoBeamOff:=true;
410 end
411 else
412 raise;
413
414 gettoken;
415 if token='(' then
416 begin
417 check('(',IDH_DRAW_axes);
418 exp1:=NExpression;
419 check(',',IDH_DRAW_axes);
420 exp2:=NExpression;
421 check(')',IDH_DRAW_axes);
422 end;
423 statusmes.clear;
424 HelpContext:=0;
425 end;
426 end;
427
428 if token='WITH' then
429 begin
430 gettoken;
431 transform:=Transformation;
432 if transform=nil then seterr('',IDH_PICTURE);
433 end;
434 end;
435
436 destructor TDRAW.destroy;
437 begin
438 transform.free;
439 inherited destroy;
440 end;
441 (*
442 procedure TDRAW.exec;
443 var
444 a:TAffine;
445 begin
446 try
447 if transform<>nil then
448 begin
449 a:=Taffine.create;
450 a.push; // a���currenttransform���������
451 currentoperation:=self;
452 transform.make(a);
453 if a.next<>nil then
454 a.mlt(a.next);
455 currentoperation:=nil;
456 end;
457
458 MyGraphSys.beam:=MyGraphSys.beam
459 and ( (MyGraphSys.BeamMode=bmImmortal)
460 or (Routine<>nil) and Routine.NoBeamOff
461 or (Routine=nil) and NobeamOff );
462
463 if @substitution=nil then
464 inherited exec
465 else if exp1=nil then
466 substitution(1,1)
467 else
468 substitution(abs(exp1.evalX),abs(exp2.evalX));
469
470 MyGraphSys.beam:=MyGraphSys.beam
471 and ( (MyGraphSys.BeamMode=bmImmortal)
472 or (Routine<>nil) and Routine.NoBeamOff
473 or (Routine=nil) and NobeamOff );
474
475 finally
476 if transform<>nil then
477 pop;
478 end;
479 end;
480 *)
481 function TDRAW.OverflowErCode:integer;
482 begin
483 result:=-1005
484 end;
485
486 function TDRAW.InvalidErCode:integer;
487 begin
488 result:=-3009
489 end;
490
491 function TDRAW.OpName:string;
492 begin
493 result:=s_TDrawOpName;
494 end;
495
496
497 function TTransformMatrix.code:ansistring;
498 begin
499 result:=' mlt('+mat.code+');'
500 end;
501
502 function TTransformFunction.Code:ansistring;
503 begin
504 result:='('+exp1.Code+','+exp2.Code+');'
505 end;
506
507 function TSHIFT.Code:Ansistring;
508 begin
509 if exp2<>nil then
510 result:=' shift'+inherited code
511 else
512 result:=' shift('+exp1.Code+');'
513 end;
514
515
516 function TSCALE1.code:ansistring;
517 begin
518 result:=' scale1('+exp1.Code+');'
519 end;
520
521 function TSCALEC.code:ansistring;
522 begin
523 result:=' cmlt('+exp1.Code+');'
524 end;
525
526 function TSCALE2.Code:ansistring;
527 begin
528 result:=' scale'+inherited code;
529 end;
530
531 function TROTATE.Code:ansistring;
532 begin
533 if exp1=nil then
534 result:=' rotate2('+Format20(cost)+','+Format20(sint)+');'
535 else if rad=1 then
536 result:=' rotate('+exp1.code+');'
537 else
538 result:=' rotate(('+exp1.code+')*PI/180);'
539 end;
540
541 function TSHEAR.Code:ansistring;
542 begin
543 if rad=1 then
544 result:=' shear('+exp1.code+');'
545 else
546 result:=' shear(('+exp1.code+')*PI/180);'
547 end;
548
549
550 function TcurrentTransform.Code:ansistring;
551 begin
552 result:=' mlt(CurrentTransform);'
553 end;
554
555 function TTransformList.Code1:ansistring;
556 var
557 i:integer;
558 begin
559 result:='With Taffine.create do'+EOL
560 +'begin'+EOL
561 +' push;'+EOL;
562 for i:=0 to Count-1 do
563 result := result+(items[i] as TTransformTerm).code;
564 result:=result +' if next<>nil then mlt(next);'+EOL //next���currenttransform������������
565 +'end;'+EOL
566 end;
567
568 function TTransFormList.Code2:ansistring;
569 begin
570 result:='pop;'+EOL
571 end;
572
573 function TTransformList.Code0(m:TMatrix):ansistring;
574 var
575 i:integer;
576 begin
577 result:='With Taffine.create do'+EOL
578 +'begin'+EOL;
579 for i:=0 to Count-1 do
580 result:=result+(items[i] as TTransformTerm).code;
581 result:=result +' store(' + m.Code +');'+EOL
582 +' free;'+EOL
583 +'end;'+EOL
584 end;
585
586
587 function TDraw.Code:ansistring;
588 var
589 i:integer;
590 begin
591 result:='';
592 if Transform<>nil then
593 result:=result+Transform.Code1+EOL;
594
595 if not( NoBeamoff or (Routine<>nil) and (Routine.NoBeamOff)) then
596 result:=result
597 +'MyGraphSys.beam:=MyGraphSys.beam and (MyGraphSys.BeamMode=bmImmortal);'+EOL;
598
599
600 if @substitution=nil then
601 result:=result+inherited code
602 else
603 begin
604 if @substitution=@drawaxes0 then
605 result:=result+'drawaxes0('
606 else if @substitution=@drawgrid0 then
607 result:=result+'drawgrid0('
608 else if @substitution=@drawaxes2 then
609 result:=result+'drawaxes2('
610 else if @substitution=@drawgrid2 then
611 result:=result+'drawgrid2('
612 else if @substitution=@drawcircle then
613 result:=result+'drawcircle('
614 else if @substitution=@drawdisk then
615 result:=result+'drawdisk(';
616 if exp1<>nil then
617 result:=result+exp1.code+','
618 else
619 result:=result+'1,';
620
621 if exp2<>nil then
622 result:=result+exp2.code+');'
623 else
624 result:=result+'1);';
625 end;
626
627 if Transform<>nil then
628 result:=result+Transform.Code2+EOL;
629
630 if not( NoBeamoff or (Routine<>nil) and (Routine.NoBeamOff)) then
631 result:=result
632 +'MyGraphSys.beam:=MyGraphSys.beam and (MyGraphSys.BeamMode=bmImmortal);'+EOL;
633 end;
634
635
636
637 {
638 function transformInv(var x,y:extended):boolean;far;
639 begin
640 result:=currenttransform.invtransform(x,y);
641 end;
642 }
643
644 procedure statementTableinit;far;
645 begin
646 StatementTableInitImperative('DRAW',DRAWst);
647 end;
648
649 begin
650 tableInitProcs.accept(statementTableinit) ;
651 //graphic.transform:=transform;
652 //graphic.inversetransform:=transforminv;
653
654 end.
655
656
657
658

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26