1
From henkz@cs.utwente.nl Thu Mar 9 09:24:21 2000
2
Date: Wed, 23 Feb 2000 09:51:10 +0100 (MET)
3
From: Henk van de Zandschulp <henkz@cs.utwente.nl>
5
Subject: Fwd: goochelen met TCM
9
TCM kan zelfs gebruikt worden om kunst te maken :)
10
Bijgaande het probleem, en gelijk maar een mogelijke oplossing erbij?
14
> Als er tussen twee verschillend grote elementen meerdere lijnen getekend
15
> worden kunnen deze nog wel eens op de foute plaats terechtkomen. Zie
18
> Hieronder zet ik ook maar een alogritme neer dat dit probleem kan
19
> corrigeren, maar dat ook voor een mooie verdeling van meerdere edges
20
> tussen nodes zorgt die niet precies naast of boven elkaar getekend zijn.
26
> Een algoritme om edges tussen twee nodes te verdelen (ik weet niet of
27
> ik het al eens heb verteld):
29
> Vooronderstellingen:
30
> a) Elke node type heeft een beschrijving van de omtrek, samengesteld uit
31
> polygonale stukken en 1/4-cirkels. Deze beschrijving wordt gebruikt
32
> om te berekenen waar een edge de rand van een node treft; zij kan
33
> ook gebruikt worden om de node te tekenen. (Let op bij nodes met
34
> lijnen die niet aan de buitenkant liggen, zoals notes).
35
> b) Elke node type heeft een ,,zwaartepunt''. Dit kan eventueel uit de
36
> gegevens a) berekend worden. (behalve bij notes). Bij driehoeken is
37
> te overwegen of je het grafische middenpunt wilt gebruiken of het
38
> echte zwaartepunt (dat er iets onder ligt); als je namelijk met het
39
> onderstaande algoritme ��n horizontale lijn tussen twee driehoeken
40
> berekent verbindt deze de grafische middenpunten, niet de zwaarte-
43
> Gegeven twee nodes, a en b; te tekenen n edges tussen de nodes.
45
> 1. Bereken de zwaartepunten Z(a) en Z(b). Bepaal de richting van het
46
> lijnstuk Z(a)--Z(b).
48
> 2. Bepaal de tangenten in richting Z(a)--Z(b) aan a en b. Dit levert
49
> de raakpunten R1(a), R2(a), R1(b) en R2(b) op. (Dus een lijn door
50
> R1(a) in de richting van Z(a)--Z(b) is een tangent aan a, en R1(a)
51
> ligt op de rand van a.) Als een randpunt, b. v. R1(a), niet
52
> eenduidig vastligt, kies R1(a) zo dicht mogelijk bij Z(b).
54
> 3. Verdeel het lijnstuk R1(a)--R2(a) in n+1 gelijke delen. Dit levert
55
> de punten O(a,0)=R1(a), O(a,1), O(a,2), ..., O(a,n), O(a,n+1)=R2(a)
56
> op; deze punten liggen alle op ��n lijn en twee opeenvolgende punten
57
> hebben steeds dezelfde afstand.
59
> 4. Doe hetzelfde met het lijnstuk R1(b)--R2(b). Dit levert de punten
60
> O(b,0)=R1(b), O(b,1), ..., O(b,n+1)=R2(b) op.
62
> 5. De edges komen te liggen op de lijnen O(a,1)--O(b,1), O(a,2)--O(b,2),
63
> ..., O(a,n)--O(b,n).
65
> 6. Om het exacte begin- en eindpunt van de edges te bepalen gebruik de
66
> gegevens van vooronderstelling a) om het snijpunt van elk
67
> polygoonstuk of 1/4-cirkel met de lijn te berekenen.
69
> Als je meer uitleg wilt kan ik tekeningen maken, maar liever niet per
73
Ik zal je de betreffend file zo separaat sturen.
74
Is wel een leuke testcase :)