[wadalabfont-kit] / renderer / newjoint.l  

Annotation of /renderer/newjoint.l

Parent Directory | Revision Log

Revision: 1.5 - (view) (download)

1 : ktanaka 1.1 ;
2 :     (defun joint (fonttype affines prims (alist))
3 :     (do ((outlines (affinepart (applykanji (car prims)fonttype)(car affines)))
4 :     (a (cdr affines)(cdr a))
5 :     (p (cdr prims)(cdr p)))
6 :     ((atom p)`(,(car outlines),(cadr outlines).,(append alist a)))
7 :     (setq outlines
8 :     (appendpart outlines
9 :     (affinepart (applykanji (car p) fonttype)(car a))))))
10 :     ;
11 :     (defun applyhook (prim jointtype i n)
12 :     (lets ((alist (cddr prim))
13 :     (hook (assq 'primhook alist)))
14 :     (cond ((and hook (funcall (cadr hook) jointtype i n)
15 :     (funcall (cddr hook) prim jointtype i n)))
16 :     (t prim))))
17 :     ;
18 :     (putprop
19 :     'tate
20 :     #'(lambda (fonttype prims)
21 :     (lets ((nprims (mapcar prims #'(lambda (x) (applykanji x fonttype))))
22 :     (affines (affine-tate-n nprims fonttype)))
23 :     `(joint ',affines ',prims nil)))
24 :     'expand)
25 :     (defun tate (fonttype prims)
26 :     (lets ((nprims (mapcar prims #'(lambda (x) (applykanji x fonttype))))
27 :     (affines (affine-tate-n nprims fonttype)))
28 :     (joint fonttype affines nprims nil)))
29 :     (defun affine-tate-n (primlist fonttype (alist))
30 :     (lets ((n (length primlist))
31 :     (nprims)
32 :     (affines)(newaffines)
33 :     (yunits)(yunit1)
34 :     (vals)(val)(ratio)
35 :     (aprim)
36 :     (param)(yscale)(centerp)
37 :     (newalist `((xlimitratio . 1.0) .,alist))
38 : ktanaka 1.4 (xunit)(xlimit))
39 : ktanaka 1.1 (do ((l primlist (cdr l))
40 :     (i 0 (1+ i))
41 :     (prim)
42 :     (xunitmin)
43 :     (realregion)
44 :     (region)
45 :     )
46 :     ((atom l)
47 :     (setq yunits (nreverse yunits))
48 :     (setq affines (nreverse affines))
49 :     (setq xunit xunitmin)
50 :     )
51 :     (setq aprim (applykanji (car l) fonttype))
52 :     (setq aprim (applyhook aprim 'tate i n))
53 :     (and (prim-center aprim)(setq centerp 200))
54 :     (push (add-xlimit (add-unit aprim)) nprims)
55 :     (setq xlimit (assq 'xlimit (cddar nprims)))
56 :     (setq realregion (realregion (car nprims)))
57 :     (push (region2region `(,(cadr xlimit) ,(second realregion)
58 :     ,(caddr xlimit) ,(fourth realregion))
59 :     '(0 0 400 200))
60 :     affines)
61 :     (setq prim (affinepart (car nprims) (car affines)))
62 :     (push (yunit prim 200.0) yunits)
63 :     (setq xunit (xunit prim 100.0))
64 :     (and xunit (or (null xunitmin)(greaterp xunitmin xunit))
65 :     (setq xunitmin xunit)))
66 :     (setq primlist (nreverse nprims))
67 :     (setq yunit1 (car yunits))
68 :     (setq param `((xunit 0 .,xunit)(yunit 0 .,yunit1)))
69 :     (do ((l (cdr primlist) (cdr l))
70 :     (yunit_l (cdr yunits) (cdr yunit_l))
71 :     (affine_l (cdr affines)(cdr affine_l))
72 :     (affine)(prim)
73 :     (lastprim (affinepart (car primlist)(car affines))))
74 :     ((atom l))
75 :     (setq ratio (//$ (float yunit1)(float (car yunit_l))))
76 :     (setq affine
77 :     (times-affine (vector 6 `(1 0 0 ,ratio 0 10000)) (car affine_l)))
78 :     (setq prim (affinepart (car l) affine))
79 :     (setq val (difference 10005
80 :     (general-limit lastprim prim #(0 0 0 0 0 -1) param)))
81 :     ; (prind val)
82 :     (push (times-affine (vector 6 `(1 0 0 ,ratio 0 ,val))(car affine_l))
83 :     newaffines)
84 :     (setq lastprim (affinepart (car l)(car newaffines))))
85 :     (setq yscale (quotient 400.0 (plus val (times ratio 200.0))))
86 :     (do ((l newaffines (cdr l))
87 :     (ret `((yunit .,(times yscale yunit1))
88 :     (xunit .,xunit)
89 :     (xlimit 0 400)
90 :     (center .,centerp)))
91 :     (vec (vector 6 `(1 0 0 ,yscale 0 0))))
92 :     ((atom l)
93 :     (push (times-affine vec (car affines)) ret)
94 :     ret)
95 :     (push (times-affine vec (car l)) ret))))
96 :    
97 :     ;
98 :     ; 横方向
99 :     ;
100 :     (putprop
101 :     'yoko
102 :     #'(lambda (fonttype prims)
103 :     (lets ((nprims (mapcar prims #'(lambda (x) (applykanji x fonttype))))
104 :     (affines (affine-yoko-n nprims fonttype)))
105 :     `(joint ',affines ',prims nil)))
106 :     'expand)
107 :     (defun yoko (fonttype prims)
108 :     (lets ((nprims (mapcar prims #'(lambda (x) (applykanji x fonttype))))
109 :     (affines (affine-yoko-n nprims fonttype)))
110 :     (joint fonttype affines nprims nil)))
111 :     (defun affine-yoko-n (primlist fonttype (alist))
112 :     (lets ((n (length primlist))
113 :     (nprims)
114 :     (affines)(newaffines)
115 :     (xunits)(xunit1)
116 :     (vals)(val)(ratio)
117 :     (param)(xscale)
118 :     ; (newalist `((ylimitratio . 0.5)(xlimitratio . 0.1) .,alist))
119 :     (realregion)(region)
120 : ktanaka 1.4 (yunit)(ylimit))
121 : ktanaka 1.1 (do ((l primlist (cdr l))
122 :     (i 0 (1+ i))(prim)
123 :     ; (yunitsum 0)
124 :     (aprim)
125 :     (yunitmin)
126 :     )
127 :     ((atom l)
128 :     (setq xunits (nreverse xunits))
129 :     (setq affines (nreverse affines))
130 :     ; (setq yunit (//$ (float yunitsum)(float n)))
131 :     (setq yunit yunitmin)
132 :     )
133 :     (setq aprim (applykanji (car l) fonttype))
134 :     (setq aprim (applyhook aprim 'yoko i n))
135 :     (and (prim-center aprim)(setq centerp 200))
136 :     (push (add-ylimit (add-unit aprim)) nprims)
137 :     ; (cond (
138 : ktanaka 1.5 (setq ylimit (assq 'ylimit (cddar nprims)))
139 :     (setq realregion (realregion (car nprims)))
140 :     (push (region2region `(,(first realregion) ,(cadr ylimit)
141 :     ,(third realregion) ,(caddr ylimit))
142 :     '(0 0 200 400))
143 :     affines)
144 : ktanaka 1.1 ; )
145 :     ; (t
146 :     ; (push (region-affine
147 :     ; (virtual-region '(nil nil) '(0 0 200 400))
148 :     ; (car nprims) `((ylimit 0 . 50).,newalist) '(0 0 200 400))
149 : ktanaka 1.5 ; affines)))
150 :     ;
151 :     ;
152 :     ; (prind (car nprims))(prind (car affines))
153 : ktanaka 1.1 (setq prim (affinepart (car nprims) (car affines)))
154 :     (push (xunit prim 200.0) xunits)
155 :     ; (setq yunitsum (plus yunitsum (yunit prim 100.0)))
156 :     (setq yunit (yunit prim 100.0))
157 :     (and yunit
158 :     (or (null yunitmin)(greaterp yunitmin yunit))
159 :     (setq yunitmin yunit))
160 :     )
161 :     (setq primlist (nreverse nprims))
162 :     (setq xunit1 (car xunits))
163 :     (setq param `((yunit 0 .,yunit)(xunit 0 .,xunit1)))
164 :     (do ((l (cdr primlist) (cdr l))
165 :     (xunit_l (cdr xunits) (cdr xunit_l))
166 :     (affine_l (cdr affines)(cdr affine_l))
167 :     (affine)(prim)
168 :     (lastprim (affinepart (car primlist)(car affines))))
169 :     ((atom l))
170 :     (setq ratio (//$ (float xunit1)(float (car xunit_l))))
171 :     (setq affine
172 :     (times-affine (vector 6 `(,ratio 0 0 1 1000 0)) (car affine_l)))
173 :     (setq prim (affinepart (car l) affine))
174 :     ; (prind (list param lastprim prim))
175 :     ; (setq val (difference 1000
176 :     ; (general-limit lastprim prim #(0 0 0 0 -1 0) param)))
177 :     (setq val (difference 1001
178 :     (general-limit lastprim prim #(0 0 0 0 -1 0) param)))
179 :     ; (prind val)
180 :     (push (times-affine (vector 6 `(,ratio 0 0 1 ,val 0))(car affine_l))
181 :     newaffines)
182 :     (setq lastprim (affinepart (car l)(car newaffines))))
183 :     (setq xscale (quotient 400.0 (plus val (times ratio 200.0))))
184 :     (do ((l newaffines (cdr l))
185 :     (ret `((xunit .,(times xscale xunit1))
186 :     (yunit .,yunit)
187 :     (ylimit 0 400)
188 :     (center)))
189 :     (vec (vector 6 `(,xscale 0 0 1 0 0))))
190 :     ((atom l)
191 :     (push (times-affine vec (car affines)) ret)
192 :     ret)
193 :     (push (times-affine vec (car l)) ret))))
194 :     ;
195 :     (defun normkanji (prim)
196 :     (lets ((nprim (add-xlimit (add-ylimit (add-unit prim))))
197 :     (alist (cddr nprim))
198 :     (xlimit (assq 'xlimit alist))
199 :     (ylimit (assq 'ylimit alist))
200 :     (affine (region2region `(,(cadr xlimit),(cadr ylimit)
201 :     ,(caddr xlimit),(caddr ylimit))
202 :     '(15 15 385 385))))
203 :     (affinepart prim affine)))
204 :     ;
205 :     ; たれ, かまえ
206 :     ;
207 :     (defun affine-tare (prim1 prim2 fonttype)
208 :     (affine-inner2 (applyhook prim1 'tare 0 2)
209 :     (applyhook prim2 'tare 1 2)
210 :     nil '(300 300)
211 :     (assqcdr '(tare kamae) (cddr prim1))
212 :     ))
213 :     ;
214 :     (putprop
215 :     'tare
216 :     #'(lambda (fonttype prims)
217 :     (lets ((nprims (mapcar prims #'(lambda (x) (applykanji x fonttype))))
218 :     (affines (affine-tare (car nprims)(cadr nprims) fonttype)))
219 :     `(joint ',affines ',prims nil)))
220 :     'expand)
221 :     (defun tare (fonttype prims)
222 :     (lets ((nprims (mapcar prims #'(lambda (x) (applykanji x fonttype))))
223 :     (prim1 (car nprims))(prim2 (cadr nprims)))
224 :     (cond ((checkhook2 'tare prim1 prim2 nil))
225 :     (t
226 :     (joint fonttype
227 :     (affine-tare (car nprims)(cadr nprims) fonttype)
228 :     nprims nil)))))
229 :     ;
230 :     (defun affine-kamae (prim1 prim2 fonttype)
231 :     (affine-inner2 (applyhook prim1 'kamae 0 2)
232 :     (applyhook prim2 'kamae 1 2)
233 :     nil '(200 300)
234 :     (assqcdr 'kamae (cddr prim1))))
235 :     ;
236 :     ;
237 :     (putprop
238 :     'kamae
239 :     #'(lambda (fonttype prims)
240 :     (lets ((nprims (mapcar prims #'(lambda (x) (applykanji x fonttype))))
241 :     (affines (affine-kamae (car nprims)(cadr nprims) fonttype)))
242 :     `(joint ',affines ',prims nil)))
243 :     'expand)
244 :     (defun kamae (fonttype prims)
245 :     (lets ((nprims (mapcar prims #'(lambda (x) (applykanji x fonttype))))
246 :     (prim1 (car nprims))(prim2 (cadr nprims)))
247 :     (cond ((checkhook2 'kamae prim1 prim2 nil))
248 :     (t
249 :     (joint fonttype
250 :     (affine-kamae (car nprims)(cadr nprims) fonttype)
251 :     nprims nil)))))
252 :     ;
253 :     (defun assqcdr (key list)
254 :     (cond ((consp key)
255 :     (do ((l key (cdr l))(assq))
256 :     ((atom l))
257 :     (setq assq (assq (car l) list))
258 :     (and assq (exit (cdr assq)))))
259 :     (t
260 :     (let ((assq (assq key list)))
261 :     (and assq (cdr assq))))))
262 :     ;
263 :     (defun affine-kamae2 (prim1 prim2 prim3 fonttype)
264 :     (lets ((nprim1 `(,(car prim1) ,(cadr prim1) (center).,(cddr prim1)))
265 :     (affine1 (affine-inner2 nprim1 prim2 nil '(150 130)
266 :     (assqcdr 'kamae1 (cddr nprim1))))
267 :     (affine2 (affine-inner2 nprim1 prim3 nil '(250 130)
268 :     (assqcdr 'kamae2 (cddr nprim1)))))
269 :     `(,(car affine1),(cadr affine1),(cadr affine2).,(cddr affine1))))
270 :     ;
271 :     (putprop
272 :     'kamae2
273 :     #'(lambda (fonttype prims)
274 :     (lets ((nprims (mapcar prims #'(lambda (x) (applykanji x fonttype))))
275 :     (affines
276 :     (affine-kamae2 (car nprims)(cadr nprims)(third nprims) fonttype)))
277 :     `(joint ',affines ',prims nil)))
278 :     'expand)
279 :     (defun kamae2 (fonttype prims)
280 :     (lets ((nprims (mapcar prims #'(lambda (x) (applykanji x fonttype))))
281 :     (prim1 (car nprims))(prim2 (cadr nprims))(prim3 (third nprims)))
282 :     (joint fonttype
283 :     (affine-kamae2 prim1 prim2 prim3 fonttype)
284 :     nprims nil)))
285 :     ;
286 :     (defun affine-nyou (prim1 prim2 (alist))
287 :     (affine-inner2 (applyhook prim1 'nyou 0 2)
288 :     (applyhook prim2 'nyou 1 2)
289 :     alist '(300 100)
290 :     (assqcdr 'nyou (cddr prim1))
291 :     ))
292 :     ;
293 :     (putprop
294 :     'nyou
295 :     #'(lambda (fonttype prims)
296 :     (lets ((nprims (mapcar prims #'(lambda (x) (applykanji x fonttype))))
297 :     (affines (affine-nyou (car nprims)(cadr nprims) fonttype)))
298 :     `(joint ',affines ',prims nil)))
299 :     'expand)
300 :     (defun nyou (fonttype prims)
301 :     (lets ((nprims (mapcar prims #'(lambda (x) (applykanji x fonttype))))
302 :     (prim1 (car nprims))(prim2 (cadr nprims)))
303 :     (cond ((checkhook2 'nyou prim1 prim2 nil))
304 :     (t
305 :     (joint fonttype
306 :     (affine-nyou (car nprims)(cadr nprims) fonttype)
307 :     nprims nil)))))
308 :     ;
309 :     (defun enlarge-region (region (rate 1.1))
310 :     (lets ((minx (first region))
311 :     (miny (second region))
312 :     (maxx (third region))
313 :     (maxy (fourth region))
314 :     (centerx (times 0.5 (plus minx maxx)))
315 :     (centery (times 0.5 (plus miny maxy)))
316 :     (minx (max 0 (plus centerx (times rate (difference minx centerx)))))
317 :     (maxx (min 400 (plus centerx (times rate (difference maxx centerx)))))
318 :     (miny (max 0 (plus centery (times rate (difference miny centery)))))
319 :     (maxy (min 400 (plus centery (times rate (difference maxy centery)))))
320 :     )
321 :     `(,minx ,miny ,maxx ,maxy)))
322 :     ;
323 :     (defun interregion (r1 r2)
324 :     `(,(max (first r1)(first r2))
325 :     ,(max (second r1)(second r2))
326 :     ,(min (third r1)(third r2))
327 :     ,(min (fourth r1)(fourth r2))))
328 :    
329 :     ;
330 :     (defun affine-inner2 (prim1 prim2 alist init-point (region))
331 :     (lets ((realregion (realregion prim1))
332 :     (region (or region (largest-region prim1 init-point realregion)))
333 :     ; (soko (print region))
334 :     (nprim1 (add-unit prim1))
335 :     (xunit1 (xunit nprim1))
336 :     (yunit1 (yunit nprim1))
337 :     (nprim1
338 :     (virtual-region prim1
339 :     (enlarge-region region 1.0)))
340 :     (center1 (prim-center prim1))
341 :     (nprim2 (add-unit prim2))
342 :     (xunit2 (xunit nprim2))
343 :     (yunit2 (yunit nprim2))
344 :     ; (newalist `((xlimitratio . 0.7) .,alist))
345 :     (newalist `((ylimit 0 . 50)(xlimitratio . 0.7) .,alist))
346 :     (nprim3 `(,(car nprim1) ,(cadr nprim1)
347 :     (center .,center1) .,(cddr nprim1)))
348 :     ; (soko (break))
349 :     (affine (region-affine nprim3 nprim2 newalist region))
350 :     (xunit2 (times (vref affine 0) xunit2))
351 :     (yunit2 (times (vref affine 3) yunit2))
352 :     (xunit (min xunit1 xunit2))
353 :     (yunit (min yunit1 yunit2))
354 :     )
355 :     `(#(1 0 0 1 0 0)
356 :     ,affine
357 :     (center .,center1)
358 :     (xunit .,xunit)
359 :     (yunit .,yunit)
360 :     .,(cddr prim1)
361 :     )))
362 :     ;
363 :     (defun goodcenter (center region)
364 :     (let ((x0 (first region))
365 :     (x1 (third region)))
366 :     (lessp (plus (times 0.7 x0)(times 0.3 x1))
367 :     center
368 :     (plus (times 0.3 x0)(times 0.7 x1)))))
369 :     ;
370 :     (comment
371 :     (defun region-affine (prim1 prim2 alist region)
372 :     (lets ((realregion (realregion prim2))
373 :     (rw (float (region-width realregion)))
374 :     (rh (float (region-height realregion)))
375 :     (xunit (xunit prim2))
376 :     (yunit (yunit prim2))
377 :     (center1 (prim-center prim1))
378 :     (center2 (prim-center prim2))
379 :     (center (and center1 (goodcenter center1 region) center2))
380 :     (affine1
381 :     (cond
382 :     (center
383 :     (movexy
384 :     center1 (times 0.5 (plus (second region)(fourth region)))
385 :     (scalexy (cond ((zerop rw)1)
386 :     (t (//$ (float (region-width region))
387 :     rw)))
388 :     (cond ((zerop rh)1)
389 :     (t (//$ (float (region-height region))
390 :     rh)))
391 :     (movexy
392 :     (minus center2)
393 :     (minus (times 0.5 (plus (second realregion)
394 :     (fourth realregion))))))))
395 :     (t (region2region realregion region))))
396 :     (prim21 (affinepart prim2 affine1))
397 :     (rc (region-center region))
398 :     (rc (cond (center `(,center1 ,(cadr rc)))(t rc)))
399 :     (conv1 (scaleconv rc))
400 :     (xunit1 (times xunit (vref affine1 0)))
401 :     (yunit1 (times yunit (vref affine1 3)))
402 :     (xlimitratio (cdr (or (assq 'xlimitratio alist)'(nil . 0.3))))
403 :     (ylimitratio (cdr (or (assq 'ylimitratio alist)'(nil . 0.5))))
404 :     (alist_xlimit (assqcdr 'xlimit alist))
405 :     (alist_ylimit (assqcdr 'ylimit alist))
406 :     (xlimit (times xlimitratio xunit1))
407 :     (ylimit (times ylimitratio yunit1))
408 :     (oldparam `((xlimit .,(or alist_xlimit (cons xlimit xlimit)))
409 :     (ylimit .,(or alist_ylimit (cons ylimit ylimit)))))
410 :     ; (soko (break))
411 :     (section1 (goodsection1
412 :     (general-section prim1 prim21 conv1
413 :     `((xunit ,xunit1 .,xunit1)
414 :     (yunit ,yunit1 .,yunit1).,oldparam))))
415 :     ; (soko (break))
416 :     (limit1 (plus 1 (rm-eq (cdr section1))))
417 :     (llimit1 (plus 1 (rm-eq (car section1))))
418 :     (limit11)(limit12)
419 :     (lratio (cond ((and llimit1 (lessp (times 0.63 limit1) llimit1))
420 :     ; (break)
421 :     (setq limit11 (//$ (float llimit1)(float limit1)))
422 :     (setq limit12 (plus (times 0.5 limit11) 0.5))
423 :     (setq limit11 (plus (times 0.25 limit11) 0.75))
424 :     (//$ limit11 (difference limit11 limit12)))
425 :     (t (setq limit11 0.7 limit12 0.63) 10.0)))
426 :    
427 :     (limit11 (difference (times limit11 limit1) 1))
428 :     (affine21 (times-affine (scale-affine limit11 conv1) affine1))
429 :     (prim221 (affinepart prim2 affine21))
430 :     (xunit21 (times (plus 1 limit11) xunit1))
431 :     (yunit21 (times (plus 1 limit11) yunit1))
432 :     (xlimit1 (times xlimitratio xunit21))
433 :     (ylimit1 (times ylimitratio yunit21))
434 :     (oldparam `((xlimit .,(or alist_xlimit (cons 0 xlimit1)))
435 :     (ylimit .,(or alist_ylimit (cons 0 ylimit1)))))
436 :     (param `((xunit 0 .,xunit21)(yunit 0 .,yunit21).,oldparam))
437 :     (section21 (general-section prim1 prim221 #(0 0 0 0 0 1) param))
438 :     (ay (section-plus section21))
439 :     (by (section-minus section21))
440 :     (section31 (general-section prim1 prim221 #(0 0 0 0 1 0) param))
441 :     (ax (section-plus section31))
442 :     (bx (section-minus section31))
443 :    
444 :     (limit12 (difference (times limit12 limit1) 1))
445 :     (affine22 (times-affine (scale-affine limit12 conv1) affine1))
446 :     (prim222 (affinepart prim2 affine22))
447 :     (xunit22 (times (plus 1 limit12) xunit1))
448 :     (yunit22 (times (plus 1 limit12) yunit1))
449 :     (xlimit2 (times xlimitratio xunit22))
450 :     (ylimit2 (times ylimitratio yunit22))
451 :     (oldparam `((xlimit .,(or alist_xlimit (cons 0 xlimit2)))
452 :     (ylimit .,(or alist_ylimit (cons 0 ylimit2)))))
453 :     (param `((xunit 0 .,xunit22)(yunit 0 .,yunit22).,oldparam))
454 :     (section22 (general-section prim1 prim222 #(0 0 0 0 0 1) param))
455 :     (cy (section-plus section22))
456 :     (dy (section-minus section22))
457 :     (section32 (general-section prim1 prim222 #(0 0 0 0 1 0) param))
458 :     (cx (section-plus section32))
459 :     (dx (section-minus section32))
460 :     (px (times lratio (difference cx ax)))
461 :     (qx (times lratio (difference dx bx)))
462 :     (py (times lratio (difference cy ay)))
463 :     (qy (times lratio (difference dy by)))
464 :     ; (soko (print rc))
465 :     (rc1 `(,(plus (car rc)
466 :     (times 0.5 (difference (plus px ax)(plus qx bx))))
467 :     ,(plus (cadr rc)
468 :     (times 0.5 (difference (plus py ay)(plus qy by))))))
469 :     (rc1 (cond (center `(,center1 ,(cadr rc1)))(t rc1)))
470 :     ; (soko (print rc1))
471 :     (sx (cond (center
472 :     (min (//$ (plus ax px) px)(//$ (plus bx qx) qx)))
473 :     (t (//$ (float (plus px qx ax bx))(float (plus qx px))))))
474 :     (sy (//$ (float (plus py qy ay by))(float (plus qy py))))
475 :     ; (soko (print (list "sx sy" sx sy)))
476 :     (dx (cond (center 0)(t (times 0.5 (difference ax bx)))))
477 :     (dy (times 0.5 (difference ay by)))
478 :     ; (soko (print (list "dx dy" dx dy)))
479 :     (affine5 (movexy (car rc1)(cadr rc1)
480 :     (scalexy sx sy
481 :     (movexy(difference dx (car rc1))
482 :     (difference dy (cadr rc1))
483 :     affine21))))
484 :     (prim25 (affinepart prim2 affine5))
485 :     (conv5 (scaleconv rc1))
486 :     (xunit5 (times xunit (vref affine5 0)))
487 :     (yunit5 (times yunit (vref affine5 3)))
488 :     (xlimit (times xlimitratio xunit5))
489 :     (ylimit (times ylimitratio yunit5))
490 :     (oldparam `((xlimit .,(or alist_xlimit (cons xlimit xlimit)))
491 :     (ylimit .,(or alist_ylimit (cons ylimit ylimit)))))
492 :     (limit5 (general-limit prim1 prim25 conv5
493 :     `((xunit ,xunit5 .,xunit5)
494 :     (yunit ,yunit5 .,yunit5).,oldparam)))
495 :     (limit5 (or limit5 0.8)))
496 :     (times-affine (scale-affine limit5 conv5) affine5)))
497 :     )
498 :     ;
499 :     (defun largest-region (prim point (orgregion '(0 0 400 400)))
500 :     (lets ((px (car point))
501 :     (py (cadr point))
502 :     (points (car prim))
503 :     (lines (cadr prim))
504 :     (largest-region (assq 'largest-region (cddr prim)))
505 :     (minx (first orgregion))
506 :     (miny (second orgregion))
507 :     (maxx (third orgregion))
508 :     (maxy (fourth orgregion)))
509 :     (cond
510 :     (largest-region (cdr largest-region))
511 :     (t
512 :     (do ((l lines (cdr l)))
513 :     ((atom l)`(,minx ,miny ,maxx ,maxy))
514 :     (do ((ll (cadar l) (cdr ll))(p0)(p1)(x0)(x1)(y0)(y1)(x)(y))
515 :     ((atom (cdr ll)))
516 :     (setq p0 (nth (car ll) points) p1 (nth (cadr ll) points))
517 :     (setq x0 (car p0) y0 (cadr p0))
518 :     (setq x1 (car p1) y1 (cadr p1))
519 :     (cond
520 :     ((and (greaterp y0 py)(greaterp y1 py)
521 :     (or (greaterp x0 px x1)(greaterp x1 px x0))
522 :     (lessp
523 :     (setq y
524 :     (plus
525 :     (times (float y1)
526 :     (//$
527 :     (float (difference px x0))
528 :     (float (difference x1 x0))))
529 :     (times y0
530 :     (//$
531 :     (float (difference x1 px))
532 :     (float (difference x1 x0))))))
533 :     maxy))
534 :     (setq maxy y))
535 :     ((and (lessp y0 py)(lessp y1 py)
536 :     (or (greaterp x0 px x1)(greaterp x1 px x0))
537 :     (greaterp
538 :     (setq y
539 :     (plus
540 :     (times (float y1)
541 :     (//$
542 :     (float (difference px x0))
543 :     (float (difference x1 x0))))
544 :     (times y0
545 :     (//$
546 :     (float (difference x1 px))
547 :     (float (difference x1 x0))))))
548 :     miny))
549 :     (setq miny y))
550 :     ((and (greaterp x0 px)(greaterp x1 px)
551 :     (or (greaterp y0 py y1)(greaterp y1 py y0))
552 :     (lessp
553 :     (setq x
554 :     (plus
555 :     (times (float x1)
556 :     (//$
557 :     (float (difference py y0))
558 :     (float (difference y1 y0))))
559 :     (times x0
560 :     (//$
561 :     (float (difference y1 py))
562 :     (float (difference y1 y0))))))
563 :     maxx))
564 :     (setq maxx x))
565 :     ((and (lessp x0 px)(lessp x1 px)
566 :     (or
567 :     (greaterp y0 py y1)(greaterp y1 py y0)
568 :     )
569 :     (greaterp
570 :     (setq x
571 :     (plus
572 :     (times (float x1)
573 :     (//$
574 :     (float (difference py y0))
575 :     (float (difference y1 y0))))
576 :     (times x0
577 :     (//$
578 :     (float (difference y1 py))
579 :     (float (difference y1 y0))))))
580 :     minx))
581 :     (setq minx x)))))))))
582 :     ;
583 :     (defun region2region (region1 region2)
584 :     (lets ((x11 (first region1))(y11 (second region1))
585 :     (x21 (first region2))(y21 (second region2))
586 :     (diffx1 (difference (third region1)(first region1)))
587 :     (diffy1 (difference (fourth region1)(second region1)))
588 :     (diffx2 (difference (third region2)(first region2)))
589 :     (diffy2 (difference (fourth region2)(second region2))))
590 :     (cond ((and (zerop diffx1)(zerop diffy1))
591 :     (lets
592 :     ((cx (difference (times 0.5 (plus x21 (third region2))) x11))
593 :     (cy (difference (times 0.5 (plus y21 (fourth region2))) y11)))
594 :     (vector 6 `(1 0 0 1 ,cx ,cy))))
595 :    
596 :     ((zerop diffx1)
597 :     (lets ((scaley (//$ (float diffy2)(float diffy1)))
598 :     (cx (difference (times 0.5 (plus x21 (third region2))) x11))
599 :     (cy (difference y21 (times y11 scaley))))
600 :     (vector 6 `(1 0 0 ,scaley ,cx ,cy))))
601 :     ((zerop diffy1)
602 :     (lets ((scalex (//$ (float diffx2)(float diffx1)))
603 :     (cy (difference (times 0.5 (plus y21 (fourth region2))) y11))
604 :     (cx (difference x21 (times x11 scalex))))
605 :     (vector 6 `(,scalex 0 0 1 ,cx ,cy))))
606 :     (t
607 :     (lets ((scalex (//$ (float diffx2)(float diffx1)))
608 :     (scaley (//$ (float diffy2)(float diffy1)))
609 :     (cx (difference x21 (times x11 scalex)))
610 :     (cy (difference y21 (times y11 scaley))))
611 :     (vector 6 `(,scalex 0 0 ,scaley ,cx ,cy)))))))
612 :     ;
613 :     (defun scaleconv (center)
614 :     (lets ((cx (car center))
615 :     (cy (cadr center)))
616 :     (vector 6 `(1 0 0 1 ,(minus cx) ,(minus cy)))))
617 :     ;
618 :     (defun virtual-region (prim region)
619 :     (lets ((points (car prim))
620 :     (lines (cadr prim))
621 :     (alist (cddr prim))
622 :     (index (length points))
623 :     (x0 (first region))(y0 (second region))
624 :     (x1 (third region))(y1 (fourth region)))
625 :     `(,(append points `((,x0 ,y0)(,x1 ,y0)(,x0 ,y1)(,x1 ,y1)))
626 :     ((ylimit (,index ,(1+ index)))
627 :     (ylimit (,(+ index 2) ,(+ index 3)))
628 :     (xlimit (,index ,(+ index 2)))
629 :     (xlimit (,(1+ index) ,(+ index 3)))
630 :     .,lines)
631 :     .,alist)))
632 :     ;
633 :     (defun times-affine (a b)
634 :     (lets ((a11 (vref a 0))(a12 (vref a 2))(a13 (vref a 4))
635 :     (a21 (vref a 1))(a22 (vref a 3))(a23 (vref a 5))
636 :     (b11 (vref b 0))(b12 (vref b 2))(b13 (vref b 4))
637 :     (b21 (vref b 1))(b22 (vref b 3))(b23 (vref b 5))
638 :     (n11 (plus (times a11 b11)(times a12 b21)))
639 :     (n12 (plus (times a11 b12)(times a12 b22)))
640 :     (n13 (plus a13 (times a11 b13)(times a12 b23)))
641 :     (n21 (plus (times a21 b11)(times a22 b21)))
642 :     (n22 (plus (times a21 b12)(times a22 b22)))
643 :     (n23 (plus a23 (times a21 b13)(times a22 b23))))
644 :     (vector 6 `(,n11 ,n21 ,n12 ,n22 ,n13 ,n23))))
645 :     ;
646 :     (defun scaleregion (region sx sy)
647 :     (lets ((x0 (first region))
648 :     (y0 (second region))
649 :     (x1 (third region))
650 :     (y1 (fourth region))
651 :     (cx (times 0.5 (plus x0 x1)))
652 :     (cy (times 0.5 (plus y0 y1)))
653 :     (wx (times sx (difference x1 cx)))
654 :     (wy (times sy (difference y1 cy))))
655 :     `(,(difference cx wx) ,(difference cy wy) ,(plus cx wx) ,(plus cy wy))))
656 :     ;
657 :     (defun section-width (section)
658 :     (let ((sec (goodsection section)))
659 :     (difference (rm-eq (cdr sec))(rm-eq (car sec)))))
660 :     ;
661 :     (defun section-center (section)
662 :     (let ((sec (goodsection section)))
663 :     (times 0.5 (plus (rm-eq (cdr sec))(rm-eq (car sec))))))
664 :     ;
665 :     (defun section-plus (section)
666 :     (let ((sec (goodsection section)))
667 :     (rm-eq (cdr sec))))
668 :     ;
669 :     (defun section-minus (section)
670 :     (let ((sec (goodsection section)))
671 :     (minus (rm-eq (car sec)))))
672 :     ;
673 :     (defun goodsection (section)
674 :     (do ((l (notsection section) (cdr l)))
675 :     ((atom (cdr l))
676 :     ; (print "illegal section" terminal-output)
677 :     ; (print section terminal-output)
678 :     (car l))
679 :     (and (numberp (rm-eq (caar l)))(not (plusp (rm-eq (caar l))))
680 :     (numberp (rm-eq (cdar l)))(not (minusp (rm-eq (cdar l))))
681 :     (exit (car l)))
682 :     (and (cdr l)
683 :     (numberp (rm-eq (cdar l)))(not (plusp (rm-eq (cdar l))))
684 :     (numberp (rm-eq (caadr l)))(not (minusp (rm-eq (caadr l))))
685 :     (exit (car l)))))
686 :     ;
687 :     (comment
688 :     (defun goodsection1 (section)
689 :     (do ((l (notsection section) (cdr l)))
690 :     ((atom (cdr l))
691 :     ; (print "illegal section" terminal-output)
692 :     ; (print section terminal-output)
693 :     (car l))
694 :     (and (numberp (rm-eq (caar l)))(not (plusp (add1 (rm-eq (caar l)))))
695 :     (numberp (rm-eq (cdar l)))(not (minusp (add1 (rm-eq (cdar l)))))
696 :     (exit (car l)))
697 :     (and (cdr l)
698 :     (numberp (rm-eq (cdar l)))(not (plusp (add1(rm-eq (cdar l)))))
699 :     (numberp (rm-eq (caadr l)))(not (minusp (add1 (rm-eq (caadr l)))))
700 :     (exit (car l)))))
701 :     )
702 :     ; sectionの中にあればvalを返す
703 :     (defun in-section (val section)
704 :     (do ((l section (cdr l)))
705 :     ((atom l) nil)
706 :     (and (gt val (cdar l))(gt (caadr l) val)(exit val))))
707 :     ;
708 :     (defun in-section-width (val section)
709 :     (do ((l section (cdr l)))
710 :     ((atom l) nil)
711 :     (and (gt val (cdar l))(gt (caadr l) val)
712 :     (exit (times 2.0 (min (difference (rm-eq (caadr l)) val)
713 :     (difference val (rm-eq (cdar l)))))))))
714 :     ;
715 :     (defun region-width (region)
716 :     (difference (third region)(first region)))
717 :     ;
718 :     (defun region-height (region)
719 :     (difference (fourth region)(second region)))
720 :     ;
721 :     (defun region-center (region)
722 :     `(,(times 0.5 (plus (first region)(third region)))
723 :     ,(times 0.5 (plus (second region)(fourth region)))))
724 :     ; scale-affine
725 :     ; x+(Ax+c)t のtを代入する
726 :     (defun scale-affine (limit affine)
727 :     (vector 6 `(,(plus 1 (times limit (vref affine 0)))
728 :     ,(times limit (vref affine 1))
729 :     ,(times limit (vref affine 2))
730 :     ,(plus 1 (times limit (vref affine 3)))
731 :     ,(times limit (vref affine 4))
732 :     ,(times limit (vref affine 5)))))
733 :    
734 :    

ktanaka

Powered by ViewCVS 1.0-dev

ViewCVS and CVS Help