Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(44)

Side by Side Diff: tools/pathops_sorter.htm

Issue 1037953004: add conics to path ops (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: fix linux build Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 <!DOCTYPE html> 1 <!DOCTYPE html>
2 2
3 <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> 3 <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
4 <head> 4 <head>
5 <meta charset="utf-8" /> 5 <meta charset="utf-8" />
6 <title></title> 6 <title></title>
7 <div style="height:0"> 7 <div style="height:0">
8
9
8 <div id="sect1"> 10 <div id="sect1">
9 {{{1.80943513, 3.0778243500000002}, {1.66686702, 2.1680693600000001}, {1.6830127 2, 0}, {3, 0}}} id=1 11 {{{778, 14089}, {778, 14089.069030761719}, {777.99825114011765, 14089.1376533508 3}, {777.99479530565441, 14089.205825865269}}} id=1
10 {{{0, 1}, {0, 2}, {0.75, 2.25}, {1.75, 2.25}}} id=2 12 {{{777.99479530565441, 14089.205825865269}, {777.99133947119071, 14089.273998379 707}, {777.98617666214727, 14089.341720819473}, {777.97934876382351, 14089.40895 1282501}}} id=19
11 {{{1.75, 2.25}, {2.75, 2.25}, {4, 2}, {5, 2}}} id=4 13 {{{777.97934876382351, 14089.408951282501}, {777.96569296717644, 14089.543412208 557}, {777.94537681341171, 14089.675905227661}, {777.9187353849411, 14089.806095 123291}}} id=11
14 {{{777.9187353849411, 14089.806095123291}, {777.89209395647049, 14089.9362850189 21}, {777.85912725329399, 14090.064171791077}, {777.82017035782337, 14090.189420 223236}}} id=7
15 {{{777.82017035782337, 14090.189420223236}, {777.78121346235275, 14090.314668655 396}, {777.73626637458801, 14090.437278747559}, {777.68566417694092, 14090.55691 5283203}}} id=13
16 {{{777.68566417694092, 14090.556915283203}, {777.63506197929382, 14090.676551818 848}, {777.57880467176437, 14090.793214797974}, {777.51722733676434, 14090.90656 9004059}}} id=5
17 {{{777.51722733676434, 14090.906569004059}, {777.4556500017643, 14091.0199232101 48}, {777.38875263929367, 14091.129968643181}, {777.31687033176422, 14091.236370 08667}}} id=15
18 {{{777.31687033176422, 14091.23637008667}, {777.24498802423477, 14091.3427715301 51}, {777.1681207716465, 14091.44552898407}, {777.08660365641117, 14091.54430723 1903}}} id=9
19 {{{777.08660365641117, 14091.544307231903}, {777.00508654117584, 14091.643085479 736}, {776.91891956329346, 14091.737884521484}, {776.82843780517578, 14091.82836 9140625}}} id=17
20
21 {{{778, 14089}, {777.99997329711914, 14089.103515625}, {777.99537348747253, 1408 9.205139160156}}} id=2
22 {{{777.99537348747253, 14089.205139160156}, {777.99077367782593, 14089.306762695 312}, {777.98160076141357, 14089.406494140625}}} id=18
23 {{{777.98160076141357, 14089.406494140625}, {777.96325492858887, 14089.605957031 25}, {777.92661666870117, 14089.7978515625}}} id=10
24 {{{777.92661666870117, 14089.7978515625}, {777.88997840881348, 14089.98974609375 }, {777.83504772186279, 14090.174072265625}}} id=6
25 {{{777.83504772186279, 14090.174072265625}, {777.78011703491211, 14090.358398437 5}, {777.70689392089844, 14090.53515625}}} id=12
26 {{{777.70689392089844, 14090.53515625}, {777.63367080688477, 14090.7119140625}, {777.54215526580811, 14090.881103515625}}} id=4
27 {{{777.54215526580811, 14090.881103515625}, {777.45063972473145, 14091.050292968 75}, {777.3408317565918, 14091.2119140625}}} id=14
28 {{{777.3408317565918, 14091.2119140625}, {777.23102378845215, 14091.37353515625} , {777.10292339324951, 14091.527587890625}}} id=8
29 {{{777.10292339324951, 14091.527587890625}, {776.97482299804687, 14091.681640625 }, {776.82843017578125, 14091.828125}}} id=16
12 </div> 30 </div>
13 31
14 <div id="sect2"> 32 <div id="sect2">
15 {{{1.80943513, 3.0778243500000002}, {1.66686702, 2.1680693600000001}, {1.6830127 2, 0}, {3, 0}}} id=1 33 {{{777.9187353849411, 14089.806095123291}, {777.89209395647049, 14089.9362850189 21}, {777.85912725329399, 14090.064171791077}, {777.82017035782337, 14090.189420 223236}}} id=7
16 {{{0, 1}, {0, 2}, {0.75, 2.25}, {1.75, 2.25}}} id=2 34 {{{777.82017035782337, 14090.189420223236}, {777.78121346235275, 14090.314668655 396}, {777.73626637458801, 14090.437278747559}, {777.68566417694092, 14090.55691 5283203}}} id=13
17 {{{1.75, 2.25}, {2.2500000000000018, 2.25}, {2.8124999999999991, 2.1875}, {3.375 , 2.125}}} id=4 35 {{{777.68566417694092, 14090.556915283203}, {777.63506197929382, 14090.676551818 848}, {777.57880467176437, 14090.793214797974}, {777.51722733676434, 14090.90656 9004059}}} id=5
36 {{{777.51722733676434, 14090.906569004059}, {777.4556500017643, 14091.0199232101 48}, {777.38875263929367, 14091.129968643181}, {777.31687033176422, 14091.236370 08667}}} id=15
37 {{{777.31687033176422, 14091.23637008667}, {777.24498802423477, 14091.3427715301 51}, {777.1681207716465, 14091.44552898407}, {777.08660365641117, 14091.54430723 1903}}} id=9
38 {{{777.08660365641117, 14091.544307231903}, {777.00508654117584, 14091.643085479 736}, {776.91891956329346, 14091.737884521484}, {776.82843780517578, 14091.82836 9140625}}} id=17
39 {{{777.83504772186279, 14090.174072265625}, {777.78011703491211, 14090.358398437 5}, {777.70689392089844, 14090.53515625}}} id=12
40 {{{777.70689392089844, 14090.53515625}, {777.63367080688477, 14090.7119140625}, {777.54215526580811, 14090.881103515625}}} id=4
41 {{{777.54215526580811, 14090.881103515625}, {777.45063972473145, 14091.050292968 75}, {777.3408317565918, 14091.2119140625}}} id=14
42 {{{777.3408317565918, 14091.2119140625}, {777.23102378845215, 14091.37353515625} , {777.10292339324951, 14091.527587890625}}} id=8
43 {{{777.10292339324951, 14091.527587890625}, {776.97482299804687, 14091.681640625 }, {776.82843017578125, 14091.828125}}} id=16
18 </div> 44 </div>
19 45
20 <div id="sect3"> 46 <div id="sect3">
21 {{{1.80943513, 3.0778243500000002}, {1.738151075, 2.6229468550000004}, {1.706545 4725, 1.8534907675000001}, {1.85738429375, 1.19775405375}}} id=1 47 {{{778, 14089}, {777.99994659423828, 14089.20703125}, {777.98160076141357, 14089 .406494140625}}} id=2
22 {{{0, 1}, {0, 2}, {0.75, 2.25}, {1.75, 2.25}}} id=2 48 {{{777.98160076141357, 14089.406494140625}, {777.96325492858887, 14089.605957031 25}, {777.92661666870117, 14089.7978515625}}} id=10
23 {{{1.75, 2.25}, {2.2500000000000018, 2.25}, {2.8124999999999991, 2.1875}, {3.375 , 2.125}}} id=4 49 {{{777.92661666870117, 14089.7978515625}, {777.88997840881348, 14089.98974609375 }, {777.83504772186279, 14090.174072265625}}} id=6
24 </div> 50 {{{777.83504772186279, 14090.174072265625}, {777.78011703491211, 14090.358398437 5}, {777.70689392089844, 14090.53515625}}} id=12
25 51 {{{777.70689392089844, 14090.53515625}, {777.63367080688477, 14090.7119140625}, {777.54215526580811, 14090.881103515625}}} id=4
26 <div id="sect4"> 52 {{{777.54215526580811, 14090.881103515625}, {777.45063972473145, 14091.050292968 75}, {777.3408317565918, 14091.2119140625}}} id=14
27 {{{1.80943513, 3.0778243500000002}, {1.7737931025, 2.8503856025000003}, {1.74807 06881249999, 2.5443022068750003}, {1.7501136332812499, 2.2131114089062502}}} id= 1 53 {{{777.3408317565918, 14091.2119140625}, {777.1212158203125, 14091.53515625}, {7 76.82843017578125, 14091.828125}}} id=8
28 {{{0, 1}, {0, 2}, {0.75, 2.25}, {1.75, 2.25}}} id=2 54 {{{778, 14089}, {778, 14089.138061523438}, {777.99300456047058, 14089.2744903564 45}, {777.97934876382351, 14089.408951282501}}} id=1
29 {{{1.75, 2.25}, {2.2500000000000018, 2.25}, {2.8124999999999991, 2.1875}, {3.375 , 2.125}}} id=4 55 {{{777.97934876382351, 14089.408951282501}, {777.96569296717644, 14089.543412208 557}, {777.94537681341171, 14089.675905227661}, {777.9187353849411, 14089.806095 123291}}} id=11
30 </div> 56 {{{777.9187353849411, 14089.806095123291}, {777.89209395647049, 14089.9362850189 21}, {777.85912725329399, 14090.064171791077}, {777.82017035782337, 14090.189420 223236}}} id=7
31 57 {{{777.82017035782337, 14090.189420223236}, {777.78121346235275, 14090.314668655 396}, {777.73626637458801, 14090.437278747559}, {777.68566417694092, 14090.55691 5283203}}} id=13
32 <div id="sect5"> 58 {{{777.68566417694092, 14090.556915283203}, {777.63506197929382, 14090.676551818 848}, {777.57880467176437, 14090.793214797974}, {777.51722733676434, 14090.90656 9004059}}} id=5
33 {{{1.80943513, 3.0778243500000002}, {1.7737931025, 2.8503856025000003}, {1.74807 06881249999, 2.5443022068750003}, {1.7501136332812499, 2.2131114089062502}}} id= 1 59 {{{777.51722733676434, 14090.906569004059}, {777.4556500017643, 14091.0199232101 48}, {777.38875263929367, 14091.129968643181}, {777.31687033176422, 14091.236370 08667}}} id=15
34 {{{0.5, 2}, {0.81249999999999956, 2.1874999999999987}, {1.2500000000000009, 2.25 00000000000013}, {1.75, 2.25}}} id=8 60 {{{777.31687033176422, 14091.23637008667}, {777.17310571670532, 14091.4491729736 33}, {777.00940132141113, 14091.647399902344}, {776.82843780517578, 14091.828369 140625}}} id=9
35 {{{1.75, 2.25}, {2.2500000000000018, 2.25}, {2.8124999999999991, 2.1875}, {3.375 , 2.125}}} id=4
36 </div>
37
38 <div id="sect6">
39 {{{1.80943513, 3.0778243500000002}, {1.7737931025, 2.8503856025000003}, {1.74807 06881249999, 2.5443022068750003}, {1.7501136332812499, 2.2131114089062502}}} id= 1
40 {{{0.5, 2}, {0.81249999999999956, 2.1874999999999987}, {1.2500000000000009, 2.25 00000000000013}, {1.75, 2.25}}} id=8
41 {{{1.75, 2.25}, {1.9999999999999976, 2.25}, {2.2656250000000022, 2.234375}, {2.5 390625, 2.2109375}}} id=4
42 </div>
43
44 <div id="sect7">
45 {{{1.80943513, 3.0778243500000002}, {1.7737931025, 2.8503856025000003}, {1.74807 06881249999, 2.5443022068750003}, {1.7501136332812499, 2.2131114089062502}}} id= 1
46 {{{1.0546875, 2.1953125}, {1.2656250000000009, 2.2343750000000009}, {1.499999999 9999996, 2.2499999999999996}, {1.75, 2.25}}} id=12
47 {{{1.75, 2.25}, {1.9999999999999976, 2.25}, {2.2656250000000022, 2.234375}, {2.5 390625, 2.2109375}}} id=4
48 </div>
49
50 <div id="sect8">
51 {{{1.7656425168945311, 2.6843748983789064}, {1.7550120280078125, 2.5380253562890 633}, {1.7490921607031253, 2.3787068078906248}, {1.7501136332812499, 2.213111408 9062502}}} id=7
52 {{{1.0546875, 2.1953125}, {1.2656250000000009, 2.2343750000000009}, {1.499999999 9999996, 2.2499999999999996}, {1.75, 2.25}}} id=12
53 {{{1.75, 2.25}, {1.9999999999999976, 2.25}, {2.2656250000000022, 2.234375}, {2.5 390625, 2.2109375}}} id=4
54 </div>
55
56 <div id="sect9">
57 {{{1.7656425168945311, 2.6843748983789064}, {1.7550120280078125, 2.5380253562890 633}, {1.7490921607031253, 2.3787068078906248}, {1.7501136332812499, 2.213111408 9062502}}} id=7
58 {{{1.0546875, 2.1953125}, {1.2656250000000009, 2.2343750000000009}, {1.499999999 9999996, 2.2499999999999996}, {1.75, 2.25}}} id=12
59 {{{1.75, 2.25}, {1.8750000000000016, 2.2499999999999991}, {2.0039062499999982, 2 .2460937500000004}, {2.1357421875, 2.2392578125}}} id=4
60 </div>
61
62 <div id="sect10">
63 {{{1.7656425168945311, 2.6843748983789064}, {1.7550120280078125, 2.5380253562890 633}, {1.7490921607031253, 2.3787068078906248}, {1.7501136332812499, 2.213111408 9062502}}} id=7
64 {{{1.3876953125, 2.2373046875}, {1.50390625, 2.24609375}, {1.625, 2.25}, {1.75, 2.25}}} id=16
65 {{{1.75, 2.25}, {1.8750000000000016, 2.2499999999999991}, {2.0039062499999982, 2 .2460937500000004}, {2.1357421875, 2.2392578125}}} id=4
66 </div>
67
68 <div id="sect11">
69 {{{1.7535085895385742, 2.4559603499780276}, {1.7508274956738286, 2.3771375952441 409}, {1.7496028969921869, 2.2959091083984369}, {1.7501136332812499, 2.213111408 9062502}}} id=9
70 {{{1.3876953125, 2.2373046875}, {1.50390625, 2.24609375}, {1.625, 2.25}, {1.75, 2.25}}} id=16
71 {{{1.75, 2.25}, {1.8750000000000016, 2.2499999999999991}, {2.0039062499999982, 2 .2460937500000004}, {2.1357421875, 2.2392578125}}} id=4
72 </div>
73
74 <div id="sect12">
75 {{{1.7535085895385742, 2.4559603499780276}, {1.7508274956738286, 2.3771375952441 409}, {1.7496028969921869, 2.2959091083984369}, {1.7501136332812499, 2.213111408 9062502}}} id=9
76 {{{1.3876953125, 2.2373046875}, {1.50390625, 2.24609375}, {1.625, 2.25}, {1.75, 2.25}}} id=16
77 {{{1.75, 2.25}, {1.8124999999999989, 2.2499999999999996}, {1.8759765625000011, 2 .2490234374999996}, {1.9403076171875, 2.2471923828125}}} id=4
78 </div>
79
80 <div id="sect13">
81 {{{1.7535085895385742, 2.4559603499780276}, {1.7508274956738286, 2.3771375952441 409}, {1.7496028969921869, 2.2959091083984369}, {1.7501136332812499, 2.213111408 9062502}}} id=9
82 {{{1.5655517578125, 2.2469482421875}, {1.6259765625, 2.2490234375}, {1.6875, 2.2 5}, {1.75, 2.25}}} id=20
83 {{{1.75, 2.25}, {1.8124999999999989, 2.2499999999999996}, {1.8759765625000011, 2 .2490234374999996}, {1.9403076171875, 2.2471923828125}}} id=4
84 </div>
85
86 <div id="sect14">
87 {{{1.7506141751022339, 2.3360264837265015}, {1.7500367307348632, 2.2955168052368 169}, {1.7498582651367187, 2.2545102586523438}, {1.7501136332812499, 2.213111408 9062502}}} id=11
88 {{{1.5655517578125, 2.2469482421875}, {1.6259765625, 2.2490234375}, {1.6875, 2.2 5}, {1.75, 2.25}}} id=20
89 {{{1.75, 2.25}, {1.8124999999999989, 2.2499999999999996}, {1.8759765625000011, 2 .2490234374999996}, {1.9403076171875, 2.2471923828125}}} id=4
90 </div>
91
92 <div id="sect15">
93 {{{1.7506141751022339, 2.3360264837265015}, {1.7500367307348632, 2.2955168052368 169}, {1.7498582651367187, 2.2545102586523438}, {1.7501136332812499, 2.213111408 9062502}}} id=11
94 {{{1.5655517578125, 2.2469482421875}, {1.6259765625, 2.2490234375}, {1.6875, 2.2 5}, {1.75, 2.25}}} id=20
95 {{{1.75, 2.25}, {1.7812500000000011, 2.2500000000000004}, {1.8127441406249989, 2 .2497558593749991}, {1.8444671630859375, 2.2492828369140625}}} id=4
96 </div>
97
98 <div id="sect16">
99 {{{1.7506141751022339, 2.3360264837265015}, {1.7500367307348632, 2.2955168052368 169}, {1.7498582651367187, 2.2545102586523438}, {1.7501136332812499, 2.213111408 9062502}}} id=11
100 {{{1.6569976806640625, 2.2492523193359375}, {1.687744140625, 2.249755859375}, {1 .71875, 2.25}, {1.75, 2.25}}} id=24
101 {{{1.75, 2.25}, {1.7812500000000011, 2.2500000000000004}, {1.8127441406249989, 2 .2497558593749991}, {1.8444671630859375, 2.2492828369140625}}} id=4
102 </div>
103
104 <div id="sect17">
105 {{{1.7500515994997787, 2.274902385537529}, {1.7499667235723877, 2.25441218286193 79}, {1.7499859492089846, 2.2338108337792986}, {1.7501136332812499, 2.2131114089 062502}}} id=13
106 {{{1.6569976806640625, 2.2492523193359375}, {1.687744140625, 2.249755859375}, {1 .71875, 2.25}, {1.75, 2.25}}} id=24
107 {{{1.75, 2.25}, {1.7812500000000011, 2.2500000000000004}, {1.8127441406249989, 2 .2497558593749991}, {1.8444671630859375, 2.2492828369140625}}} id=4
108 </div>
109
110 <div id="sect18">
111 {{{1.7500515994997787, 2.274902385537529}, {1.7499667235723877, 2.25441218286193 79}, {1.7499859492089846, 2.2338108337792986}, {1.7501136332812499, 2.2131114089 062502}}} id=13
112 {{{1.6569976806640625, 2.2492523193359375}, {1.687744140625, 2.249755859375}, {1 .71875, 2.25}, {1.75, 2.25}}} id=24
113 {{{1.75, 2.25}, {1.7656249999999989, 2.25}, {1.7813110351562511, 2.2499389648437 5}, {1.7970561981201172, 2.2498188018798828}}} id=4
114 </div>
115
116 <div id="sect19">
117 {{{1.7500515994997787, 2.274902385537529}, {1.7499667235723877, 2.25441218286193 79}, {1.7499859492089846, 2.2338108337792986}, {1.7501136332812499, 2.2131114089 062502}}} id=13
118 {{{1.7033100128173828, 2.2498149871826172}, {1.7188110351562504, 2.2499389648437 504}, {1.7343749999999991, 2.2499999999999991}, {1.75, 2.25}}} id=28
119 {{{1.75, 2.25}, {1.7656249999999989, 2.25}, {1.7813110351562511, 2.2499389648437 5}, {1.7970561981201172, 2.2498188018798828}}} id=4
120 </div>
121
122 <div id="sect20">
123 {{{1.7500515994997787, 2.274902385537529}, {1.7500091615360831, 2.26465728419973 37}, {1.7499927489633849, 2.2543843962601757}, {1.7500029063906433, 2.2440853555 459359}}} id=13
124 {{{1.7033100128173828, 2.2498149871826172}, {1.7188110351562504, 2.2499389648437 504}, {1.7343749999999991, 2.2499999999999991}, {1.75, 2.25}}} id=28
125 {{{1.75, 2.25}, {1.7656249999999989, 2.25}, {1.7813110351562511, 2.2499389648437 5}, {1.7970561981201172, 2.2498188018798828}}} id=4
126 </div>
127
128 <div id="sect21">
129 {{{1.7500515994997787, 2.274902385537529}, {1.7500091615360831, 2.26465728419973 37}, {1.7499927489633849, 2.2543843962601757}, {1.7500029063906433, 2.2440853555 459359}}} id=13
130 {{{1.7033100128173828, 2.2498149871826172}, {1.7188110351562504, 2.2499389648437 504}, {1.7343749999999991, 2.2499999999999991}, {1.75, 2.25}}} id=28
131 {{{1.75, 2.25}, {1.7578125000000004, 2.25}, {1.7656402587890616, 2.2499847412109 375}, {1.7734830379486084, 2.2499544620513916}}} id=4
132 </div>
133
134 <div id="sect22">
135 {{{1.7500515994997787, 2.274902385537529}, {1.7500091615360831, 2.26465728419973 37}, {1.7499927489633849, 2.2543843962601757}, {1.7500029063906433, 2.2440853555 459359}}} id=13
136 {{{1.7266085147857666, 2.2499539852142334}, {1.7343902587890614, 2.2499847412109 362}, {1.7421875000000011, 2.2500000000000013}, {1.75, 2.25}}} id=32
137 {{{1.75, 2.25}, {1.7578125000000004, 2.25}, {1.7656402587890616, 2.2499847412109 375}, {1.7734830379486084, 2.2499544620513916}}} id=4
138 </div>
139
140 <div id="sect23">
141 {{{1.7500075296736033, 2.2595140978078994}, {1.749999391463374, 2.25437785806650 53}, {1.7499978276770138, 2.2492348759030554}, {1.7500029063906433, 2.2440853555 459359}}} id=17
142 {{{1.7266085147857666, 2.2499539852142334}, {1.7343902587890614, 2.2499847412109 362}, {1.7421875000000011, 2.2500000000000013}, {1.75, 2.25}}} id=32
143 {{{1.75, 2.25}, {1.7578125000000004, 2.25}, {1.7656402587890616, 2.2499847412109 375}, {1.7734830379486084, 2.2499544620513916}}} id=4
144 </div>
145
146 <div id="sect24">
147 {{{1.7500075296736033, 2.2595140978078994}, {1.749999391463374, 2.25437785806650 53}, {1.7499978276770138, 2.2492348759030554}, {1.7500029063906433, 2.2440853555 459359}}} id=17
148 {{{1.7266085147857666, 2.2499539852142334}, {1.7343902587890614, 2.2499847412109 362}, {1.7421875000000011, 2.2500000000000013}, {1.75, 2.25}}} id=32
149 {{{1.75, 2.25}, {1.7539062499999991, 2.25}, {1.7578163146972661, 2.2499961853027 344}, {1.7617301642894745, 2.2499885857105255}}} id=4
150 </div>
151
152 <div id="sect25">
153 {{{1.7500075296736033, 2.2595140978078994}, {1.749999391463374, 2.25437785806650 53}, {1.7499978276770138, 2.2492348759030554}, {1.7500029063906433, 2.2440853555 459359}}} id=17
154 {{{1.7382927238941193, 2.2499885261058807}, {1.7421913146972665, 2.2499961853027 353}, {1.7460937499999996, 2.2499999999999996}, {1.75, 2.25}}} id=36
155 {{{1.75, 2.25}, {1.7539062499999991, 2.25}, {1.7578163146972661, 2.2499961853027 344}, {1.7617301642894745, 2.2499885857105255}}} id=4
156 </div>
157
158 <div id="sect26">
159 {{{1.7500002616856762, 2.2518047069078144}, {1.7499994883020116, 2.2492332413546 396}, {1.7500003670338282, 2.2466601157244943}, {1.7500029063906433, 2.244085355 5459359}}} id=19
160 {{{1.75, 2.25}, {1.7539062499999991, 2.25}, {1.7578163146972661, 2.2499961853027 344}, {1.7617301642894745, 2.2499885857105255}}} id=4
161 </div>
162
163 <div id="sect27">
164 {{{1.7500002616856762, 2.2518047069078144}, {1.7499994883020116, 2.2492332413546 396}, {1.7500003670338282, 2.2466601157244943}, {1.7500029063906433, 2.244085355 5459359}}} id=19
165 {{{1.75, 2.25}, {1.7519531250000011, 2.2499999999999991}, {1.7539072036743153, 2 .249999046325684}, {1.7558622322976589, 2.2499971427023411}}} id=4
166 </div>
167
168 <div id="sect28">
169 {{{1.7500002616856762, 2.2518047069078144}, {1.749999874993843, 2.25051897413122 73}, {1.7499999013308822, 2.2492328263353962}, {1.7500003417604797, 2.2479462667 113941}}} id=19
170 {{{1.75, 2.25}, {1.7519531250000011, 2.2499999999999991}, {1.7539072036743153, 2 .249999046325684}, {1.7558622322976589, 2.2499971427023411}}} id=4
171 </div>
172
173 <div id="sect29">
174 {{{1.7500002616856762, 2.2518047069078144}, {1.749999874993843, 2.25051897413122 73}, {1.7499999013308822, 2.2492328263353962}, {1.7500003417604797, 2.2479462667 113941}}} id=19
175 {{{1.75, 2.25}, {1.7509765624999989, 2.2499999999999996}, {1.7519533634185802, 2 .2499997615814205}, {1.752930402290076, 2.249999285209924}}} id=4
176 </div>
177
178 <div id="sect30">
179 {{{1.7500002616856762, 2.2518047069078144}, {1.7500000683397601, 2.2511618405195 208}, {1.7499999782510609, 2.2505188703764163}, {1.7499999915525417, 2.249875796 8773848}}} id=19
180 {{{1.75, 2.25}, {1.7509765624999989, 2.2499999999999996}, {1.7519533634185802, 2 .2499997615814205}, {1.752930402290076, 2.249999285209924}}} id=4
181 </div>
182
183 <div id="sect31">
184 {{{1.7500002616856762, 2.2518047069078144}, {1.7500000683397601, 2.2511618405195 208}, {1.7499999782510609, 2.2505188703764163}, {1.7499999915525417, 2.249875796 8773848}}} id=19
185 {{{1.75, 2.25}, {1.7504882812500011, 2.2500000000000004}, {1.7509766221046437, 2 .2499999403953543}, {1.7514650225057267, 2.2499998212442733}}} id=4
186 </div>
187
188 <div id="sect32">
189 {{{1.7500000491263352, 2.2508403295591259}, {1.7500000040986061, 2.2505188445374 351}, {1.7499999849018013, 2.2501973336269003}, {1.7499999915525417, 2.249875796 8773848}}} id=25
190 {{{1.75, 2.25}, {1.7504882812500011, 2.2500000000000004}, {1.7509766221046437, 2 .2499999403953543}, {1.7514650225057267, 2.2499998212442733}}} id=4
191 </div>
192
193 <div id="sect33">
194 {{{1.7500000491263352, 2.2508403295591259}, {1.7500000040986061, 2.2505188445374 351}, {1.7499999849018013, 2.2501973336269003}, {1.7499999915525417, 2.249875796 8773848}}} id=25
195 {{{1.75, 2.25}, {1.7502441406249989, 2.25}, {1.7504882961511623, 2.2499999850988 388}, {1.7507324665712076, 2.2499999553037924}}} id=4
196 </div>
197
198 <div id="sect34">
199 {{{1.7500000009600125, 2.2503580826161893}, {1.7499999913636877, 2.2501973271671 556}, {1.7499999882271713, 2.2500365652521426}, {1.7499999915525417, 2.249875796 8773848}}} id=27
200 {{{1.75, 2.25}, {1.7502441406249989, 2.25}, {1.7504882961511623, 2.2499999850988 388}, {1.7507324665712076, 2.2499999553037924}}} id=4
201 </div>
202
203 <div id="sect35">
204 {{{1.7500000009600125, 2.2503580826161893}, {1.7499999913636877, 2.2501973271671 556}, {1.7499999882271713, 2.2500365652521426}, {1.7499999915525417, 2.249875796 8773848}}} id=27
205 {{{1.75, 2.25}, {1.7501220703125004, 2.25}, {1.7502441443502894, 2.2499999962747 097}, {1.7503662221124614, 2.2499999888250386}}} id=4
206 </div>
207
208 <div id="sect36">
209 </div> 61 </div>
210 62
211 </div> 63 </div>
212 64
213 <script type="text/javascript"> 65 <script type="text/javascript">
214 66
215 var testDivs = [ 67 var testDivs = [
216 sect1, 68 sect1,
217 sect2, 69 sect2,
218 sect3, 70 sect3,
219 sect4, 71 ];
220 sect5,
221 sect6,
222 sect7,
223 sect8,
224 sect9,
225 sect10,
226 sect11,
227 sect12,
228 sect13,
229 sect14,
230 sect15,
231 sect16,
232 sect17,
233 sect18,
234 sect19,
235 sect20,
236 sect21,
237 sect22,
238 sect23,
239 sect24,
240 sect25,
241 sect26,
242 sect27,
243 sect28,
244 sect29,
245 sect30,
246 sect31,
247 sect32,
248 sect33,
249 sect34,
250 sect35,
251 sect36,
252
253
254 ];
255 72
256 var decimal_places = 3; 73 var decimal_places = 3;
257 74
258 var tests = []; 75 var tests = [];
259 var testTitles = []; 76 var testTitles = [];
260 var testIndex = 0; 77 var testIndex = 0;
261 var ctx; 78 var ctx;
262 79
263 var subscale = 1; 80 var subscale = 1;
264 var xmin, xmax, ymin, ymax; 81 var xmin, xmax, ymin, ymax;
265 var scale; 82 var scale;
266 var initScale; 83 var initScale;
267 var mouseX, mouseY; 84 var mouseX, mouseY;
268 var mouseDown = false; 85 var mouseDown = false;
269 var srcLeft, srcTop; 86 var srcLeft, srcTop;
270 var screenWidth, screenHeight; 87 var screenWidth, screenHeight;
271 var drawnPts; 88 var drawnPts;
272 var curveT = 0; 89 var curveT = 0;
90 var curveW = -1;
273 91
274 var lastX, lastY; 92 var lastX, lastY;
275 var activeCurve = []; 93 var activeCurve = [];
276 var activePt; 94 var activePt;
277 var ids = []; 95 var ids = [];
278 96
279 var focus_on_selection = 0; 97 var focus_on_selection = 0;
280 var draw_t = false; 98 var draw_t = false;
99 var draw_w = false;
281 var draw_closest_t = false; 100 var draw_closest_t = false;
282 var draw_cubic_red = false; 101 var draw_cubic_red = false;
283 var draw_derivative = false; 102 var draw_derivative = false;
284 var draw_endpoints = 2; 103 var draw_endpoints = 2;
285 var draw_id = false; 104 var draw_id = 0;
286 var draw_midpoint = 0; 105 var draw_midpoint = 0;
287 var draw_mouse_xy = false; 106 var draw_mouse_xy = false;
288 var draw_order = false; 107 var draw_order = false;
289 var draw_point_xy = false; 108 var draw_point_xy = false;
290 var draw_ray_intersect = false; 109 var draw_ray_intersect = false;
291 var draw_quarterpoint = 0; 110 var draw_quarterpoint = 0;
292 var draw_tangents = 1; 111 var draw_tangents = 1;
293 var draw_sortpoint = 0; 112 var draw_sortpoint = 0;
294 var retina_scale = !!window.devicePixelRatio; 113 var retina_scale = !!window.devicePixelRatio;
295 114
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 canvas.style.height = unscaledHeight + 'px'; 160 canvas.style.height = unscaledHeight + 'px';
342 if (resScale != 1) { 161 if (resScale != 1) {
343 ctx.scale(resScale, resScale); 162 ctx.scale(resScale, resScale);
344 } 163 }
345 xmin = Infinity; 164 xmin = Infinity;
346 xmax = -Infinity; 165 xmax = -Infinity;
347 ymin = Infinity; 166 ymin = Infinity;
348 ymax = -Infinity; 167 ymax = -Infinity;
349 for (var curves in test) { 168 for (var curves in test) {
350 var curve = test[curves]; 169 var curve = test[curves];
351 var last = curve.length; 170 var last = curve.length - (curve.length % 2 == 1 ? 1 : 0);
352 for (var idx = 0; idx < last; idx += 2) { 171 for (var idx = 0; idx < last; idx += 2) {
353 xmin = Math.min(xmin, curve[idx]); 172 xmin = Math.min(xmin, curve[idx]);
354 xmax = Math.max(xmax, curve[idx]); 173 xmax = Math.max(xmax, curve[idx]);
355 ymin = Math.min(ymin, curve[idx + 1]); 174 ymin = Math.min(ymin, curve[idx + 1]);
356 ymax = Math.max(ymax, curve[idx + 1]); 175 ymax = Math.max(ymax, curve[idx + 1]);
357 } 176 }
358 } 177 }
359 xmin -= Math.min(1, Math.max(xmax - xmin, ymax - ymin)); 178 xmin -= Math.min(1, Math.max(xmax - xmin, ymax - ymin));
360 var testW = xmax - xmin; 179 var testW = xmax - xmin;
361 var testH = ymax - ymin; 180 var testH = ymax - ymin;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 } 217 }
399 218
400 function dxy_at_t(curve, t) { 219 function dxy_at_t(curve, t) {
401 var dxy = {}; 220 var dxy = {};
402 if (curve.length == 6) { 221 if (curve.length == 6) {
403 var a = t - 1; 222 var a = t - 1;
404 var b = 1 - 2 * t; 223 var b = 1 - 2 * t;
405 var c = t; 224 var c = t;
406 dxy.x = a * curve[0] + b * curve[2] + c * curve[4]; 225 dxy.x = a * curve[0] + b * curve[2] + c * curve[4];
407 dxy.y = a * curve[1] + b * curve[3] + c * curve[5]; 226 dxy.y = a * curve[1] + b * curve[3] + c * curve[5];
227 } else if (curve.length == 7) {
228 var p20x = curve[4] - curve[0];
229 var p20y = curve[5] - curve[1];
230 var p10xw = (curve[2] - curve[0]) * curve[6];
231 var p10yw = (curve[3] - curve[1]) * curve[6];
232 var coeff0x = curve[6] * p20x - p20x;
233 var coeff0y = curve[6] * p20y - p20y;
234 var coeff1x = p20x - 2 * p10xw;
235 var coeff1y = p20y - 2 * p10yw;
236 dxy.x = t * (t * coeff0x + coeff1x) + p10xw;
237 dxy.y = t * (t * coeff0y + coeff1y) + p10yw;
408 } else if (curve.length == 8) { 238 } else if (curve.length == 8) {
409 var one_t = 1 - t; 239 var one_t = 1 - t;
410 var a = curve[0]; 240 var a = curve[0];
411 var b = curve[2]; 241 var b = curve[2];
412 var c = curve[4]; 242 var c = curve[4];
413 var d = curve[6]; 243 var d = curve[6];
414 dxy.x = 3 * ((b - a) * one_t * one_t + 2 * (c - b) * t * one_t + (d - c) * t * t); 244 dxy.x = 3 * ((b - a) * one_t * one_t + 2 * (c - b) * t * one_t + (d - c) * t * t);
415 a = curve[1]; 245 a = curve[1];
416 b = curve[3]; 246 b = curve[3];
417 c = curve[5]; 247 c = curve[5];
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 function cubic_roots(A, B, C, D) { 414 function cubic_roots(A, B, C, D) {
585 var s = cubic_real_roots(A, B, C, D); 415 var s = cubic_real_roots(A, B, C, D);
586 var foundRoots = add_valid_ts(s); 416 var foundRoots = add_valid_ts(s);
587 return foundRoots; 417 return foundRoots;
588 } 418 }
589 419
590 function ray_curve_intersect(startPt, endPt, curve) { 420 function ray_curve_intersect(startPt, endPt, curve) {
591 var adj = endPt[0] - startPt[0]; 421 var adj = endPt[0] - startPt[0];
592 var opp = endPt[1] - startPt[1]; 422 var opp = endPt[1] - startPt[1];
593 var r = []; 423 var r = [];
594 for (var n = 0; n < curve.length / 2; ++n) { 424 var len = (curve.length == 7 ? 6 : curve.length) / 2;
425 for (var n = 0; n < len; ++n) {
595 r[n] = (curve[n * 2 + 1] - startPt[1]) * adj - (curve[n * 2] - start Pt[0]) * opp; 426 r[n] = (curve[n * 2 + 1] - startPt[1]) * adj - (curve[n * 2] - start Pt[0]) * opp;
596 } 427 }
597 if (curve.length == 6) { 428 if (curve.length == 6) {
598 var A = r[2]; 429 var A = r[2];
599 var B = r[1]; 430 var B = r[1];
600 var C = r[0]; 431 var C = r[0];
601 A += C - 2 * B; // A = a - 2*b + c 432 A += C - 2 * B; // A = a - 2*b + c
602 B -= C; // B = -(b - c) 433 B -= C; // B = -(b - c)
603 return quad_roots(A, 2 * B, C); 434 return quad_roots(A, 2 * B, C);
604 } 435 }
436 if (curve.length == 7) {
437 var A = r[2];
438 var B = r[1] * curve[6];
439 var C = r[0];
440 A += C - 2 * B; // A = a - 2*b + c
441 B -= C; // B = -(b - c)
442 return quad_roots(A, 2 * B, C);
443 }
605 var A = r[3]; // d 444 var A = r[3]; // d
606 var B = r[2] * 3; // 3*c 445 var B = r[2] * 3; // 3*c
607 var C = r[1] * 3; // 3*b 446 var C = r[1] * 3; // 3*b
608 var D = r[0]; // a 447 var D = r[0]; // a
609 A -= D - C + B; // A = -a + 3*b - 3*c + d 448 A -= D - C + B; // A = -a + 3*b - 3*c + d
610 B += 3 * D - 2 * C; // B = 3*a - 6*b + 3*c 449 B += 3 * D - 2 * C; // B = 3*a - 6*b + 3*c
611 C -= 3 * D; // C = -3*a + 3*b 450 C -= 3 * D; // C = -3*a + 3*b
612 return cubic_roots(A, B, C, D); 451 return cubic_roots(A, B, C, D);
613 } 452 }
614 453
615 function x_at_t(curve, t) { 454 function x_at_t(curve, t) {
616 var one_t = 1 - t; 455 var one_t = 1 - t;
617 if (curve.length == 4) { 456 if (curve.length == 4) {
618 return one_t * curve[0] + t * curve[2]; 457 return one_t * curve[0] + t * curve[2];
619 } 458 }
620 var one_t2 = one_t * one_t; 459 var one_t2 = one_t * one_t;
621 var t2 = t * t; 460 var t2 = t * t;
622 if (curve.length == 6) { 461 if (curve.length == 6) {
623 return one_t2 * curve[0] + 2 * one_t * t * curve[2] + t2 * curve[4]; 462 return one_t2 * curve[0] + 2 * one_t * t * curve[2] + t2 * curve[4];
624 } 463 }
464 if (curve.length == 7) {
465 var numer = one_t2 * curve[0] + 2 * one_t * t * curve[2] * curve[6]
466 + t2 * curve[4];
467 var denom = one_t2 + 2 * one_t * t * curve[6]
468 + t2;
469 return numer / denom;
470 }
625 var a = one_t2 * one_t; 471 var a = one_t2 * one_t;
626 var b = 3 * one_t2 * t; 472 var b = 3 * one_t2 * t;
627 var c = 3 * one_t * t2; 473 var c = 3 * one_t * t2;
628 var d = t2 * t; 474 var d = t2 * t;
629 return a * curve[0] + b * curve[2] + c * curve[4] + d * curve[6]; 475 return a * curve[0] + b * curve[2] + c * curve[4] + d * curve[6];
630 } 476 }
631 477
632 function y_at_t(curve, t) { 478 function y_at_t(curve, t) {
633 var one_t = 1 - t; 479 var one_t = 1 - t;
634 if (curve.length == 4) { 480 if (curve.length == 4) {
635 return one_t * curve[1] + t * curve[3]; 481 return one_t * curve[1] + t * curve[3];
636 } 482 }
637 var one_t2 = one_t * one_t; 483 var one_t2 = one_t * one_t;
638 var t2 = t * t; 484 var t2 = t * t;
639 if (curve.length == 6) { 485 if (curve.length == 6) {
640 return one_t2 * curve[1] + 2 * one_t * t * curve[3] + t2 * curve[5]; 486 return one_t2 * curve[1] + 2 * one_t * t * curve[3] + t2 * curve[5];
641 } 487 }
488 if (curve.length == 7) {
489 var numer = one_t2 * curve[1] + 2 * one_t * t * curve[3] * curve[6]
490 + t2 * curve[5];
491 var denom = one_t2 + 2 * one_t * t * curve[6]
492 + t2;
493 return numer / denom;
494 }
642 var a = one_t2 * one_t; 495 var a = one_t2 * one_t;
643 var b = 3 * one_t2 * t; 496 var b = 3 * one_t2 * t;
644 var c = 3 * one_t * t2; 497 var c = 3 * one_t * t2;
645 var d = t2 * t; 498 var d = t2 * t;
646 return a * curve[1] + b * curve[3] + c * curve[5] + d * curve[7]; 499 return a * curve[1] + b * curve[3] + c * curve[5] + d * curve[7];
647 } 500 }
648 501
649 function drawPointAtT(curve) { 502 function drawPointAtT(curve) {
650 var x = x_at_t(curve, curveT); 503 var x = x_at_t(curve, curveT);
651 var y = y_at_t(curve, curveT); 504 var y = y_at_t(curve, curveT);
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
721 var boundsY = b - t; 574 var boundsY = b - t;
722 var boundsDist = boundsX * boundsX + boundsY * boundsY; 575 var boundsDist = boundsX * boundsX + boundsY * boundsY;
723 if (closestDist > boundsDist) { 576 if (closestDist > boundsDist) {
724 return -1; 577 return -1;
725 } 578 }
726 console.log("closestDist = " + closestDist + " boundsDist = " + boundsDi st 579 console.log("closestDist = " + closestDist + " boundsDist = " + boundsDi st
727 + " t = " + closest / 16); 580 + " t = " + closest / 16);
728 return closest / 16; 581 return closest / 16;
729 } 582 }
730 583
584 var kMaxConicToQuadPOW2 = 5;
585
586 function computeQuadPOW2(curve, tol) {
587 var a = curve[6] - 1;
588 var k = a / (4 * (2 + a));
589 var x = k * (curve[0] - 2 * curve[2] + curve[4]);
590 var y = k * (curve[1] - 2 * curve[3] + curve[5]);
591
592 var error = Math.sqrt(x * x + y * y);
593 var pow2;
594 for (pow2 = 0; pow2 < kMaxConicToQuadPOW2; ++pow2) {
595 if (error <= tol) {
596 break;
597 }
598 error *= 0.25;
599 }
600 return pow2;
601 }
602
603 function subdivide_w_value(w) {
604 return Math.sqrt(0.5 + w * 0.5);
605 }
606
607 function chop(curve, part1, part2) {
608 var w = curve[6];
609 var scale = 1 / (1 + w);
610 part1[0] = curve[0];
611 part1[1] = curve[1];
612 part1[2] = (curve[0] + curve[2] * w) * scale;
613 part1[3] = (curve[1] + curve[3] * w) * scale;
614 part1[4] = part2[0] = (curve[0] + (curve[2] * w) * 2 + curve[4]) * scale * 0.5;
615 part1[5] = part2[1] = (curve[1] + (curve[3] * w) * 2 + curve[5]) * scale * 0.5;
616 part2[2] = (curve[2] * w + curve[4]) * scale;
617 part2[3] = (curve[3] * w + curve[5]) * scale;
618 part2[4] = curve[4];
619 part2[5] = curve[5];
620 part1[6] = part2[6] = subdivide_w_value(w);
621 }
622
623 function subdivide(curve, level, pts) {
624 if (0 == level) {
625 pts.push(curve[2]);
626 pts.push(curve[3]);
627 pts.push(curve[4]);
628 pts.push(curve[5]);
629 } else {
630 var part1 = [], part2 = [];
631 chop(curve, part1, part2);
632 --level;
633 subdivide(part1, level, pts);
634 subdivide(part2, level, pts);
635 }
636 }
637
638 function chopIntoQuadsPOW2(curve, pow2, pts) {
639 subdivide(curve, pow2, pts);
640 return 1 << pow2;
641 }
642
643 function drawConic(curve, srcLeft, srcTop, scale) {
644 var tol = 1 / scale;
645 var pow2 = computeQuadPOW2(curve, tol);
646 var pts = [];
647 chopIntoQuadsPOW2(curve, pow2, pts);
648 for (var i = 0; i < pts.length; i += 4) {
649 ctx.quadraticCurveTo(
650 (pts[i + 0] - srcLeft) * scale, (pts[i + 1] - srcTop) * scale,
651 (pts[i + 2] - srcLeft) * scale, (pts[i + 3] - srcTop) * scale);
652 }
653 }
654
731 function draw(test, title) { 655 function draw(test, title) {
732 ctx.font = "normal 50px Arial"; 656 ctx.font = "normal 50px Arial";
733 ctx.textAlign = "left"; 657 ctx.textAlign = "left";
734 ctx.fillStyle = "rgba(0,0,0, 0.1)"; 658 ctx.fillStyle = "rgba(0,0,0, 0.1)";
735 ctx.fillText(title, 50, 50); 659 ctx.fillText(title, 50, 50);
736 ctx.font = "normal 10px Arial"; 660 ctx.font = "normal 10px Arial";
737 // ctx.lineWidth = "1.001"; "0.999"; 661 // ctx.lineWidth = "1.001"; "0.999";
738 var hullStarts = []; 662 var hullStarts = [];
739 var hullEnds = []; 663 var hullEnds = [];
740 var midSpokes = []; 664 var midSpokes = [];
741 var midDist = []; 665 var midDist = [];
742 var origin = []; 666 var origin = [];
743 var shortSpokes = []; 667 var shortSpokes = [];
744 var shortDist = []; 668 var shortDist = [];
745 var sweeps = []; 669 var sweeps = [];
746 drawnPts = []; 670 drawnPts = [];
747 for (var curves in test) { 671 for (var curves in test) {
748 var curve = test[curves]; 672 var curve = test[curves];
749 origin.push(curve[0]); 673 origin.push(curve[0]);
750 origin.push(curve[1]); 674 origin.push(curve[1]);
751 var startPt = []; 675 var startPt = [];
752 startPt.push(curve[2]); 676 startPt.push(curve[2]);
753 startPt.push(curve[3]); 677 startPt.push(curve[3]);
754 hullStarts.push(startPt); 678 hullStarts.push(startPt);
755 var endPt = []; 679 var endPt = [];
756 if (curve.length == 4) { 680 if (curve.length == 4) {
757 endPt.push(curve[2]); 681 endPt.push(curve[2]);
758 endPt.push(curve[3]); 682 endPt.push(curve[3]);
759 } else if (curve.length == 6) { 683 } else if (curve.length == 6 || curve.length == 7) {
760 endPt.push(curve[4]); 684 endPt.push(curve[4]);
761 endPt.push(curve[5]); 685 endPt.push(curve[5]);
762 } else if (curve.length == 8) { 686 } else if (curve.length == 8) {
763 endPt.push(curve[6]); 687 endPt.push(curve[6]);
764 endPt.push(curve[7]); 688 endPt.push(curve[7]);
765 } 689 }
766 hullEnds.push(endPt); 690 hullEnds.push(endPt);
767 var sweep = crossPt(origin, startPt, endPt); 691 var sweep = crossPt(origin, startPt, endPt);
768 sweeps.push(sweep); 692 sweeps.push(sweep);
769 var midPt = []; 693 var midPt = [];
(...skipping 11 matching lines...) Expand all
781 dx = shortPt[0] - origin[0]; 705 dx = shortPt[0] - origin[0];
782 dy = shortPt[1] - origin[1]; 706 dy = shortPt[1] - origin[1];
783 dist = Math.sqrt(dx * dx + dy * dy); 707 dist = Math.sqrt(dx * dx + dy * dy);
784 shortDist.push(dist); 708 shortDist.push(dist);
785 } 709 }
786 var intersect = []; 710 var intersect = [];
787 var useIntersect = false; 711 var useIntersect = false;
788 var maxWidth = Math.max(xmax - xmin, ymax - ymin); 712 var maxWidth = Math.max(xmax - xmin, ymax - ymin);
789 for (var curves in test) { 713 for (var curves in test) {
790 var curve = test[curves]; 714 var curve = test[curves];
791 if (curve.length == 6 || curve.length == 8) { 715 if (curve.length >= 6 && curve.length <= 8) {
792 var opp = curves == 0 || curves == 1 ? 0 : 1; 716 var opp = curves == 0 || curves == 1 ? 0 : 1;
793 var sects = ray_curve_intersect(origin, hullEnds[opp], curve); 717 var sects = ray_curve_intersect(origin, hullEnds[opp], curve);
794 intersect.push(sects); 718 intersect.push(sects);
795 if (sects.length > 1) { 719 if (sects.length > 1) {
796 var intersection = sects[0]; 720 var intersection = sects[0];
797 if (intersection == 0) { 721 if (intersection == 0) {
798 intersection = sects[1]; 722 intersection = sects[1];
799 } 723 }
800 var ix = x_at_t(curve, intersection) - origin[0]; 724 var ix = x_at_t(curve, intersection) - origin[0];
801 var iy = y_at_t(curve, intersection) - origin[1]; 725 var iy = y_at_t(curve, intersection) - origin[1];
802 var ex = hullEnds[opp][0] - origin[0]; 726 var ex = hullEnds[opp][0] - origin[0];
803 var ey = hullEnds[opp][1] - origin[1]; 727 var ey = hullEnds[opp][1] - origin[1];
804 if (ix * ex >= 0 && iy * ey >= 0) { 728 if (ix * ex >= 0 && iy * ey >= 0) {
805 var iDist = Math.sqrt(ix * ix + iy * iy); 729 var iDist = Math.sqrt(ix * ix + iy * iy);
806 var eDist = Math.sqrt(ex * ex + ey * ey); 730 var eDist = Math.sqrt(ex * ex + ey * ey);
807 var delta = Math.abs(iDist - eDist) / maxWidth; 731 var delta = Math.abs(iDist - eDist) / maxWidth;
808 if (delta > (curve.length == 6 ? 1e-5 : 1e-4)) { 732 if (delta > (curve.length != 8 ? 1e-5 : 1e-4)) {
809 useIntersect ^= true; 733 useIntersect ^= true;
810 } 734 }
811 } 735 }
812 } 736 }
813 } 737 }
814 } 738 }
815 var midLeft = curves != 0 ? crossPt(origin, midSpokes[0], midSpokes[1]) : 0; 739 var midLeft = curves != 0 ? crossPt(origin, midSpokes[0], midSpokes[1]) : 0;
816 var firstInside; 740 var firstInside;
817 if (useIntersect) { 741 if (useIntersect) {
818 var sect1 = intersect[0].length > 1; 742 var sect1 = intersect[0].length > 1;
(...skipping 21 matching lines...) Expand all
840 var shorter = midDist[1] < midDist[0]; 764 var shorter = midDist[1] < midDist[0];
841 var shortLeft = shorter ? crossPt(origin, shortSpokes[0], midSpokes[1]) 765 var shortLeft = shorter ? crossPt(origin, shortSpokes[0], midSpokes[1])
842 : crossPt(origin, midSpokes[0], shortSpokes[1]); 766 : crossPt(origin, midSpokes[0], shortSpokes[1]);
843 var startCross = crossPt(origin, hullStarts[0], hullStarts[1]); 767 var startCross = crossPt(origin, hullStarts[0], hullStarts[1]);
844 var disallowShort = midLeft == startCross && midLeft == sweeps[0] 768 var disallowShort = midLeft == startCross && midLeft == sweeps[0]
845 && midLeft == sweeps[1]; 769 && midLeft == sweeps[1];
846 770
847 // console.log("midLeft=" + midLeft + " startCross=" + startCross); 771 // console.log("midLeft=" + midLeft + " startCross=" + startCross);
848 var intersectIndex = 0; 772 var intersectIndex = 0;
849 for (var curves in test) { 773 for (var curves in test) {
850 var curve = test[curves]; 774 var curve = test[draw_id != 2 ? curves : test.length - curves - 1];
851 if (curve.length != 4 && curve.length != 6 && curve.length != 8) { 775 if (curve.length != 4 && curve.length != 6 && curve.length != 7 && c urve.length != 8) {
852 continue; 776 continue;
853 } 777 }
854 ctx.lineWidth = 1; 778 ctx.lineWidth = 1;
855 if (draw_tangents != 0) { 779 if (draw_tangents != 0) {
856 if (draw_cubic_red ? curve.length == 8 : firstInside == curves) { 780 if (draw_cubic_red ? curve.length == 8 : firstInside == curves) {
857 ctx.strokeStyle = "rgba(255,0,0, 0.3)"; 781 ctx.strokeStyle = "rgba(255,0,0, 0.3)";
858 } else { 782 } else {
859 ctx.strokeStyle = "rgba(0,0,255, 0.3)"; 783 ctx.strokeStyle = "rgba(0,0,255, 0.3)";
860 } 784 }
861 drawLine(curve[0], curve[1], curve[2], curve[3]); 785 drawLine(curve[0], curve[1], curve[2], curve[3]);
862 if (draw_tangents != 2) { 786 if (draw_tangents != 2) {
863 if (curve.length > 4) drawLine(curve[2], curve[3], curve[4], curve[5]); 787 if (curve.length > 4) drawLine(curve[2], curve[3], curve[4], curve[5]);
864 if (curve.length > 6) drawLine(curve[4], curve[5], curve[6], curve[7]); 788 if (curve.length == 8) drawLine(curve[4], curve[5], curve[6] , curve[7]);
865 } 789 }
866 if (draw_tangents != 1) { 790 if (draw_tangents != 1) {
867 if (curve.length == 6) drawLine(curve[0], curve[1], curve[4] , curve[5]); 791 if (curve.length == 6 || curve.length == 7) {
792 drawLine(curve[0], curve[1], curve[4], curve[5]);
793 }
868 if (curve.length == 8) drawLine(curve[0], curve[1], curve[6] , curve[7]); 794 if (curve.length == 8) drawLine(curve[0], curve[1], curve[6] , curve[7]);
869 } 795 }
870 } 796 }
871 ctx.beginPath(); 797 ctx.beginPath();
872 ctx.moveTo((curve[0] - srcLeft) * scale, (curve[1] - srcTop) * scale ); 798 ctx.moveTo((curve[0] - srcLeft) * scale, (curve[1] - srcTop) * scale );
873 if (curve.length == 4) { 799 if (curve.length == 4) {
874 ctx.lineTo((curve[2] - srcLeft) * scale, (curve[3] - srcTop) * s cale); 800 ctx.lineTo((curve[2] - srcLeft) * scale, (curve[3] - srcTop) * s cale);
875 } else if (curve.length == 6) { 801 } else if (curve.length == 6) {
876 ctx.quadraticCurveTo( 802 ctx.quadraticCurveTo(
877 (curve[2] - srcLeft) * scale, (curve[3] - srcTop) * scale, 803 (curve[2] - srcLeft) * scale, (curve[3] - srcTop) * scale,
878 (curve[4] - srcLeft) * scale, (curve[5] - srcTop) * scale); 804 (curve[4] - srcLeft) * scale, (curve[5] - srcTop) * scale);
805 } else if (curve.length == 7) {
806 drawConic(curve, srcLeft, srcTop, scale);
879 } else { 807 } else {
880 ctx.bezierCurveTo( 808 ctx.bezierCurveTo(
881 (curve[2] - srcLeft) * scale, (curve[3] - srcTop) * scale, 809 (curve[2] - srcLeft) * scale, (curve[3] - srcTop) * scale,
882 (curve[4] - srcLeft) * scale, (curve[5] - srcTop) * scale, 810 (curve[4] - srcLeft) * scale, (curve[5] - srcTop) * scale,
883 (curve[6] - srcLeft) * scale, (curve[7] - srcTop) * scale); 811 (curve[6] - srcLeft) * scale, (curve[7] - srcTop) * scale);
884 } 812 }
885 if (draw_cubic_red ? curve.length == 8 : firstInside == curves) { 813 if (draw_cubic_red ? curve.length == 8 : firstInside == curves) {
886 ctx.strokeStyle = "rgba(255,0,0, 1)"; 814 ctx.strokeStyle = "rgba(255,0,0, 1)";
887 } else { 815 } else {
888 ctx.strokeStyle = "rgba(0,0,255, 1)"; 816 ctx.strokeStyle = "rgba(0,0,255, 1)";
889 } 817 }
890 ctx.stroke(); 818 ctx.stroke();
891 if (draw_endpoints > 0) { 819 if (draw_endpoints > 0) {
892 drawPoint(curve[0], curve[1]); 820 drawPoint(curve[0], curve[1]);
893 if (draw_endpoints > 1 || curve.length == 4) { 821 if (draw_endpoints > 1 || curve.length == 4) {
894 drawPoint(curve[2], curve[3]); 822 drawPoint(curve[2], curve[3]);
895 } 823 }
896 if (curve.length == 6 || (draw_endpoints > 1 && curve.length == 8)) { 824 if (curve.length == 6 || curve.length == 7 ||
825 (draw_endpoints > 1 && curve.length == 8)) {
897 drawPoint(curve[4], curve[5]); 826 drawPoint(curve[4], curve[5]);
898 } 827 }
899 if (curve.length == 8) drawPoint(curve[6], curve[7]); 828 if (curve.length == 8) drawPoint(curve[6], curve[7]);
900 } 829 }
901 if (draw_midpoint != 0) { 830 if (draw_midpoint != 0) {
902 if ((curves == 0) == (midLeft == 0)) { 831 if ((curves == 0) == (midLeft == 0)) {
903 ctx.strokeStyle = "rgba(0,180,127, 0.6)"; 832 ctx.strokeStyle = "rgba(0,180,127, 0.6)";
904 } else { 833 } else {
905 ctx.strokeStyle = "rgba(127,0,127, 0.6)"; 834 ctx.strokeStyle = "rgba(127,0,127, 0.6)";
906 } 835 }
(...skipping 30 matching lines...) Expand all
937 + " shorter=" + shorter + " midT=" + midT); 866 + " shorter=" + shorter + " midT=" + midT);
938 var midX = x_at_t(curve, midT); 867 var midX = x_at_t(curve, midT);
939 var midY = y_at_t(curve, midT); 868 var midY = y_at_t(curve, midT);
940 drawPointSolid(midX, midY); 869 drawPointSolid(midX, midY);
941 if (draw_sortpoint > 1) { 870 if (draw_sortpoint > 1) {
942 drawLine(curve[0], curve[1], midX, midY); 871 drawLine(curve[0], curve[1], midX, midY);
943 } 872 }
944 } 873 }
945 if (draw_ray_intersect != 0) { 874 if (draw_ray_intersect != 0) {
946 ctx.strokeStyle = "rgba(75,45,199, 0.6)"; 875 ctx.strokeStyle = "rgba(75,45,199, 0.6)";
947 if (curve.length == 6 || curve.length == 8) { 876 if (curve.length >= 6 && curve.length <= 8) {
948 var intersections = intersect[intersectIndex]; 877 var intersections = intersect[intersectIndex];
949 for (var i in intersections) { 878 for (var i in intersections) {
950 var intersection = intersections[i]; 879 var intersection = intersections[i];
951 var x = x_at_t(curve, intersection); 880 var x = x_at_t(curve, intersection);
952 var y = y_at_t(curve, intersection); 881 var y = y_at_t(curve, intersection);
953 drawPointSolid(x, y); 882 drawPointSolid(x, y);
954 if (draw_ray_intersect > 1) { 883 if (draw_ray_intersect > 1) {
955 drawLine(curve[0], curve[1], x, y); 884 drawLine(curve[0], curve[1], x, y);
956 } 885 }
957 } 886 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
991 if (!approximately_zero(scale - initScale)) { 920 if (!approximately_zero(scale - initScale)) {
992 ctx.font = "normal 20px Arial"; 921 ctx.font = "normal 20px Arial";
993 ctx.fillStyle = "rgba(0,0,0, 0.3)"; 922 ctx.fillStyle = "rgba(0,0,0, 0.3)";
994 ctx.textAlign = "right"; 923 ctx.textAlign = "right";
995 ctx.fillText(scale.toFixed(decimal_places) + 'x', 924 ctx.fillText(scale.toFixed(decimal_places) + 'x',
996 screenWidth - 10, screenHeight - 5); 925 screenWidth - 10, screenHeight - 5);
997 } 926 }
998 if (draw_t) { 927 if (draw_t) {
999 drawPointAtT(curve); 928 drawPointAtT(curve);
1000 } 929 }
1001 if (draw_id) { 930 if (draw_id != 0) {
1002 var id = -1; 931 var id = -1;
1003 for (var i = 0; i < ids.length; i += 2) { 932 for (var i = 0; i < ids.length; i += 2) {
1004 if (ids[i + 1] == curve) { 933 if (ids[i + 1] == curve) {
1005 id = ids[i]; 934 id = ids[i];
1006 break; 935 break;
1007 } 936 }
1008 } 937 }
1009 if (id >= 0) { 938 if (id >= 0) {
1010 var px = x_at_t(curve, 0.5); 939 var px = x_at_t(curve, 0.5);
1011 var py = y_at_t(curve, 0.5); 940 var py = y_at_t(curve, 0.5);
1012 var _px = (px - srcLeft) * scale; 941 var _px = (px - srcLeft) * scale;
1013 var _py = (py - srcTop) * scale; 942 var _py = (py - srcTop) * scale;
1014 ctx.beginPath(); 943 ctx.beginPath();
1015 ctx.arc(_px, _py, 15, 0, Math.PI * 2, true); 944 ctx.arc(_px, _py, 15, 0, Math.PI * 2, true);
1016 ctx.closePath(); 945 ctx.closePath();
1017 ctx.fillStyle = "white"; 946 ctx.fillStyle = "white";
1018 ctx.fill(); 947 ctx.fill();
1019 ctx.strokeStyle = "rgba(255,0,0, 1)"; 948 ctx.strokeStyle = "rgba(255,0,0, 1)";
1020 ctx.fillStyle = "rgba(255,0,0, 1)"; 949 ctx.fillStyle = "rgba(255,0,0, 1)";
1021 ctx.stroke(); 950 ctx.stroke();
1022 ctx.font = "normal 16px Arial"; 951 ctx.font = "normal 16px Arial";
1023 ctx.textAlign = "center"; 952 ctx.textAlign = "center";
1024 ctx.fillText(id, _px, _py + 5); 953 ctx.fillText(id, _px, _py + 5);
1025 } 954 }
1026 } 955 }
1027 } 956 }
1028 if (draw_t) { 957 if (draw_t) {
1029 drawCurveTControl(); 958 drawCurveTControl();
1030 } 959 }
960 if (draw_w) {
961 drawCurveWControl();
962 }
1031 } 963 }
1032 964
1033 function drawCurveTControl() { 965 function drawCurveTControl() {
1034 ctx.lineWidth = 2; 966 ctx.lineWidth = 2;
1035 ctx.strokeStyle = "rgba(0,0,0, 0.3)"; 967 ctx.strokeStyle = "rgba(0,0,0, 0.3)";
1036 ctx.beginPath(); 968 ctx.beginPath();
1037 ctx.rect(screenWidth - 80, 40, 28, screenHeight - 80); 969 ctx.rect(screenWidth - 80, 40, 28, screenHeight - 80);
1038 ctx.stroke(); 970 ctx.stroke();
1039 var ty = 40 + curveT * (screenHeight - 80); 971 var ty = 40 + curveT * (screenHeight - 80);
1040 ctx.beginPath(); 972 ctx.beginPath();
1041 ctx.moveTo(screenWidth - 80, ty); 973 ctx.moveTo(screenWidth - 80, ty);
1042 ctx.lineTo(screenWidth - 85, ty - 5); 974 ctx.lineTo(screenWidth - 85, ty - 5);
1043 ctx.lineTo(screenWidth - 85, ty + 5); 975 ctx.lineTo(screenWidth - 85, ty + 5);
1044 ctx.lineTo(screenWidth - 80, ty); 976 ctx.lineTo(screenWidth - 80, ty);
1045 ctx.fillStyle = "rgba(0,0,0, 0.6)"; 977 ctx.fillStyle = "rgba(0,0,0, 0.6)";
1046 ctx.fill(); 978 ctx.fill();
1047 var num = curveT.toFixed(decimal_places); 979 var num = curveT.toFixed(decimal_places);
1048 ctx.font = "normal 10px Arial"; 980 ctx.font = "normal 10px Arial";
1049 ctx.textAlign = "left"; 981 ctx.textAlign = "left";
1050 ctx.fillText(num, screenWidth - 78, ty); 982 ctx.fillText(num, screenWidth - 78, ty);
1051 } 983 }
1052 984
985 function drawCurveWControl() {
986 var w = -1;
987 var choice = 0;
988 for (var curves in tests[testIndex]) {
989 var curve = tests[testIndex][curves];
990 if (curve.length != 7) {
991 continue;
992 }
993 if (choice == curveW) {
994 w = curve[6];
995 break;
996 }
997 ++choice;
998 }
999 if (w < 0) {
1000 return;
1001 }
1002 ctx.lineWidth = 2;
1003 ctx.strokeStyle = "rgba(0,0,0, 0.3)";
1004 ctx.beginPath();
1005 ctx.rect(screenWidth - 40, 40, 28, screenHeight - 80);
1006 ctx.stroke();
1007 var ty = 40 + w * (screenHeight - 80);
1008 ctx.beginPath();
1009 ctx.moveTo(screenWidth - 40, ty);
1010 ctx.lineTo(screenWidth - 45, ty - 5);
1011 ctx.lineTo(screenWidth - 45, ty + 5);
1012 ctx.lineTo(screenWidth - 40, ty);
1013 ctx.fillStyle = "rgba(0,0,0, 0.6)";
1014 ctx.fill();
1015 var num = w.toFixed(decimal_places);
1016 ctx.font = "normal 10px Arial";
1017 ctx.textAlign = "left";
1018 ctx.fillText(num, screenWidth - 38, ty);
1019 }
1020
1053 function ptInTControl() { 1021 function ptInTControl() {
1054 var e = window.event; 1022 var e = window.event;
1055 var tgt = e.target || e.srcElement; 1023 var tgt = e.target || e.srcElement;
1056 var left = tgt.offsetLeft; 1024 var left = tgt.offsetLeft;
1057 var top = tgt.offsetTop; 1025 var top = tgt.offsetTop;
1058 var x = (e.clientX - left); 1026 var x = (e.clientX - left);
1059 var y = (e.clientY - top); 1027 var y = (e.clientY - top);
1060 if (x < screenWidth - 80 || x > screenWidth - 50) { 1028 if (x < screenWidth - 80 || x > screenWidth - 50) {
1061 return false; 1029 return false;
1062 } 1030 }
1063 if (y < 40 || y > screenHeight - 80) { 1031 if (y < 40 || y > screenHeight - 80) {
1064 return false; 1032 return false;
1065 } 1033 }
1066 curveT = (y - 40) / (screenHeight - 120); 1034 curveT = (y - 40) / (screenHeight - 120);
1067 if (curveT < 0 || curveT > 1) { 1035 if (curveT < 0 || curveT > 1) {
1068 throw "stop execution"; 1036 throw "stop execution";
1069 } 1037 }
1070 return true; 1038 return true;
1071 } 1039 }
1072 1040
1041 function ptInWControl() {
1042 var e = window.event;
1043 var tgt = e.target || e.srcElement;
1044 var left = tgt.offsetLeft;
1045 var top = tgt.offsetTop;
1046 var x = (e.clientX - left);
1047 var y = (e.clientY - top);
1048 if (x < screenWidth - 40 || x > screenWidth - 10) {
1049 return false;
1050 }
1051 if (y < 40 || y > screenHeight - 80) {
1052 return false;
1053 }
1054 var w = (y - 40) / (screenHeight - 120);
1055 if (w < 0 || w > 1) {
1056 throw "stop execution";
1057 }
1058 var choice = 0;
1059 for (var curves in tests[testIndex]) {
1060 var curve = tests[testIndex][curves];
1061 if (curve.length != 7) {
1062 continue;
1063 }
1064 if (choice == curveW) {
1065 curve[6] = w;
1066 break;
1067 }
1068 ++choice;
1069 }
1070 return true;
1071 }
1072
1073 function drawTop() { 1073 function drawTop() {
1074 init(tests[testIndex]); 1074 init(tests[testIndex]);
1075 redraw(); 1075 redraw();
1076 } 1076 }
1077 1077
1078 function redraw() { 1078 function redraw() {
1079 if (focus_on_selection > 0) { 1079 if (focus_on_selection > 0) {
1080 var focusXmin = focusYmin = Infinity; 1080 var focusXmin = focusYmin = Infinity;
1081 var focusXmax = focusYmax = -Infinity; 1081 var focusXmax = focusYmax = -Infinity;
1082 var choice = 0; 1082 var choice = 0;
1083 for (var curves in tests[testIndex]) { 1083 for (var curves in tests[testIndex]) {
1084 if (++choice != focus_on_selection) { 1084 if (++choice != focus_on_selection) {
1085 continue; 1085 continue;
1086 } 1086 }
1087 var curve = tests[testIndex][curves]; 1087 var curve = tests[testIndex][curves];
1088 var last = curve.length; 1088 var last = curve.length - (curve.length % 2 == 1 ? 1 : 0);
1089 for (var idx = 0; idx < last; idx += 2) { 1089 for (var idx = 0; idx < last; idx += 2) {
1090 focusXmin = Math.min(focusXmin, curve[idx]); 1090 focusXmin = Math.min(focusXmin, curve[idx]);
1091 focusXmax = Math.max(focusXmax, curve[idx]); 1091 focusXmax = Math.max(focusXmax, curve[idx]);
1092 focusYmin = Math.min(focusYmin, curve[idx + 1]); 1092 focusYmin = Math.min(focusYmin, curve[idx + 1]);
1093 focusYmax = Math.max(focusYmax, curve[idx + 1]); 1093 focusYmax = Math.max(focusYmax, curve[idx + 1]);
1094 } 1094 }
1095 } 1095 }
1096 focusXmin -= Math.min(1, Math.max(focusXmax - focusXmin, focusYmax - focusYmin)); 1096 focusXmin -= Math.min(1, Math.max(focusXmax - focusXmin, focusYmax - focusYmin));
1097 if (focusXmin < focusXmax && focusYmin < focusYmax) { 1097 if (focusXmin < focusXmax && focusYmin < focusYmax) {
1098 setScale(focusXmin, focusXmax, focusYmin, focusYmax); 1098 setScale(focusXmin, focusXmax, focusYmin, focusYmax);
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
1248 redraw(); 1248 redraw();
1249 break; 1249 break;
1250 case 'u': 1250 case 'u':
1251 draw_closest_t ^= true; 1251 draw_closest_t ^= true;
1252 redraw(); 1252 redraw();
1253 break; 1253 break;
1254 case 'v': 1254 case 'v':
1255 draw_tangents = (draw_tangents + 1) % 4; 1255 draw_tangents = (draw_tangents + 1) % 4;
1256 redraw(); 1256 redraw();
1257 break; 1257 break;
1258 case 'w':
1259 ++curveW;
1260 var choice = 0;
1261 draw_w = false;
1262 for (var curves in tests[testIndex]) {
1263 var curve = tests[testIndex][curves];
1264 if (curve.length != 7) {
1265 continue;
1266 }
1267 if (choice == curveW) {
1268 draw_w = true;
1269 break;
1270 }
1271 ++choice;
1272 }
1273 if (!draw_w) {
1274 curveW = -1;
1275 }
1276 redraw();
1277 break;
1258 case 'x': 1278 case 'x':
1259 draw_point_xy ^= true; 1279 draw_point_xy ^= true;
1260 redraw(); 1280 redraw();
1261 break; 1281 break;
1262 case 'y': 1282 case 'y':
1263 draw_mouse_xy ^= true; 1283 draw_mouse_xy ^= true;
1264 redraw(); 1284 redraw();
1265 break; 1285 break;
1266 case '\\': 1286 case '\\':
1267 retina_scale ^= true; 1287 retina_scale ^= true;
1268 drawTop(); 1288 drawTop();
1269 break; 1289 break;
1270 case '`': 1290 case '`':
1271 ++focus_on_selection; 1291 ++focus_on_selection;
1272 if (focus_on_selection >= tests[testIndex].length) { 1292 if (focus_on_selection >= tests[testIndex].length) {
1273 focus_on_selection = 0; 1293 focus_on_selection = 0;
1274 } 1294 }
1275 setScale(xmin, xmax, ymin, ymax); 1295 setScale(xmin, xmax, ymin, ymax);
1276 redraw(); 1296 redraw();
1277 break; 1297 break;
1278 case '.': 1298 case '.':
1279 draw_id ^= true; 1299 draw_id = (draw_id + 1) % 3;
1280 redraw(); 1300 redraw();
1281 break; 1301 break;
1282 } 1302 }
1283 } 1303 }
1284 1304
1285 function doKeyDown(evt) { 1305 function doKeyDown(evt) {
1286 var char = evt.keyCode; 1306 var char = evt.keyCode;
1287 var preventDefault = false; 1307 var preventDefault = false;
1288 switch (char) { 1308 switch (char) {
1289 case 37: // left arrow 1309 case 37: // left arrow
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1328 mouseX = (e.clientX - left) / scale + srcLeft; 1348 mouseX = (e.clientX - left) / scale + srcLeft;
1329 mouseY = (e.clientY - top) / scale + srcTop; 1349 mouseY = (e.clientY - top) / scale + srcTop;
1330 } 1350 }
1331 1351
1332 function calcLeftTop() { 1352 function calcLeftTop() {
1333 srcLeft = mouseX - screenWidth / 2 / scale; 1353 srcLeft = mouseX - screenWidth / 2 / scale;
1334 srcTop = mouseY - screenHeight / 2 / scale; 1354 srcTop = mouseY - screenHeight / 2 / scale;
1335 } 1355 }
1336 1356
1337 function handleMouseClick() { 1357 function handleMouseClick() {
1338 if (!draw_t || !ptInTControl()) { 1358 if ((!draw_t || !ptInTControl()) && (!draw_w || !ptInWControl())) {
1339 calcXY(); 1359 calcXY();
1340 } else { 1360 } else {
1341 redraw(); 1361 redraw();
1342 } 1362 }
1343 } 1363 }
1344 1364
1345 function initDown() { 1365 function initDown() {
1346 var test = tests[testIndex]; 1366 var test = tests[testIndex];
1347 var bestDistance = 1000000; 1367 var bestDistance = 1000000;
1348 activePt = -1; 1368 activePt = -1;
1349 for (var curves in test) { 1369 for (var curves in test) {
1350 var testCurve = test[curves]; 1370 var testCurve = test[curves];
1351 if (testCurve.length != 4 && testCurve.length != 6 && testCurve.leng th != 8) { 1371 if (testCurve.length != 4 && (testCurve.length < 6 || testCurve.leng th > 8)) {
1352 continue; 1372 continue;
1353 } 1373 }
1354 for (var i = 0; i < testCurve.length; i += 2) { 1374 var testMax = testCurve.length == 7 ? 6 : testCurve.length;
1375 for (var i = 0; i < testMax; i += 2) {
1355 var testX = testCurve[i]; 1376 var testX = testCurve[i];
1356 var testY = testCurve[i + 1]; 1377 var testY = testCurve[i + 1];
1357 var dx = testX - mouseX; 1378 var dx = testX - mouseX;
1358 var dy = testY - mouseY; 1379 var dy = testY - mouseY;
1359 var dist = dx * dx + dy * dy; 1380 var dist = dx * dx + dy * dy;
1360 if (dist > bestDistance) { 1381 if (dist > bestDistance) {
1361 continue; 1382 continue;
1362 } 1383 }
1363 activeCurve = testCurve; 1384 activeCurve = testCurve;
1364 activePt = i; 1385 activePt = i;
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1430 <body onLoad="start();"> 1451 <body onLoad="start();">
1431 1452
1432 <canvas id="canvas" width="750" height="500" 1453 <canvas id="canvas" width="750" height="500"
1433 onmousedown="mouseDown = true" 1454 onmousedown="mouseDown = true"
1434 onmouseup="mouseDown = false" 1455 onmouseup="mouseDown = false"
1435 onmousemove="handleMouseOver()" 1456 onmousemove="handleMouseOver()"
1436 onclick="handleMouseClick()" 1457 onclick="handleMouseClick()"
1437 ></canvas > 1458 ></canvas >
1438 </body> 1459 </body>
1439 </html> 1460 </html>
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698