|
797 | 797 | } |
798 | 798 |
|
799 | 799 | function segStart(seg) { |
| 800 | + if ('seg' in seg) { |
| 801 | + return segStart(seg.seg); |
| 802 | + } |
800 | 803 | return 'data' in seg ? seg.data.p0 : seg.p0; |
801 | 804 | } |
802 | 805 |
|
803 | 806 | function segEnd(seg) { |
| 807 | + if ('seg' in seg) { |
| 808 | + return segEnd(seg.seg); |
| 809 | + } |
804 | 810 | if ('data' in seg) { |
805 | 811 | if ('p3' in seg.data) { |
806 | 812 | return seg.data.p3; |
|
817 | 823 | if ('data' in seg) { |
818 | 824 | return segPoint(seg.data, t); |
819 | 825 | } |
| 826 | + if ('seg' in seg) { |
| 827 | + return segPoint(seg.seg, t); |
| 828 | + } |
820 | 829 | if ('p3' in seg) { |
821 | 830 | const p0 = seg.p0; |
822 | 831 | const p1 = seg.p1; |
|
856 | 865 |
|
857 | 866 | function segPath(seg, ctx, skipMoveTo) { |
858 | 867 | if ('data' in seg) { |
859 | | - return segPath(seg.data, ctx); |
| 868 | + return segPath(seg.data, ctx, skipMoveTo); |
| 869 | + } |
| 870 | + if ('seg' in seg) { |
| 871 | + return segPath(seg.seg, ctx, skipMoveTo); |
860 | 872 | } |
861 | 873 | if (!skipMoveTo) { |
862 | 874 | ctx.moveTo(seg.p0[0], seg.p0[1]); |
|
1061 | 1073 | break; |
1062 | 1074 | case 'chain_new': |
1063 | 1075 | setChainClosed(bl.closed); |
1064 | | - bl_chains_x.push([bl.seg]); |
| 1076 | + bl_chains_x.push([bl.sf]); |
1065 | 1077 | bl_chainids_x.push(bl_nextchainid++); |
1066 | 1078 | bl_last_seg_keep = false; |
1067 | 1079 | break; |
1068 | 1080 | case 'chain_rev': { |
1069 | 1081 | setChainClosed(bl.closed); |
1070 | 1082 | const newChain = []; |
1071 | 1083 | for (let i = 0; i < bl_chains_x[bl.index].length; i++) { |
1072 | | - let seg = bl_chains_x[bl.index][i]; |
| 1084 | + const sf = bl_chains_x[bl.index][i]; |
| 1085 | + let seg = sf.seg; |
1073 | 1086 | if ('p3' in seg) { |
1074 | 1087 | seg = { p0: seg.p3, p1: seg.p2, p2: seg.p1, p3: seg.p0 }; |
1075 | 1088 | } else { |
1076 | 1089 | seg = { p0: seg.p1, p1: seg.p0 }; |
1077 | 1090 | } |
1078 | | - newChain.unshift(seg); |
| 1091 | + newChain.unshift({ seg, fill: !sf.fill }); |
1079 | 1092 | } |
1080 | 1093 | bl_chains_x[bl.index] = newChain; |
1081 | 1094 | break; |
1082 | 1095 | } |
1083 | 1096 | case 'chain_add_head': |
1084 | 1097 | setChainClosed(bl.closed); |
1085 | | - bl_chains_x[bl.index].unshift(bl.seg); |
| 1098 | + bl_chains_x[bl.index].unshift(bl.sf); |
1086 | 1099 | bl_last_seg_keep = false; |
1087 | 1100 | break; |
1088 | 1101 | case 'chain_add_tail': |
1089 | 1102 | setChainClosed(bl.closed); |
1090 | | - bl_chains_x[bl.index].push(bl.seg); |
| 1103 | + bl_chains_x[bl.index].push(bl.sf); |
1091 | 1104 | bl_last_seg_keep = false; |
1092 | 1105 | break; |
1093 | 1106 | case 'chain_simp_head': |
1094 | 1107 | setChainClosed(bl.closed); |
1095 | 1108 | bl_chains_x[bl.index].shift(); |
1096 | | - bl_chains_x[bl.index][0] = bl.seg; |
| 1109 | + bl_chains_x[bl.index][0] = bl.sf; |
1097 | 1110 | break; |
1098 | 1111 | case 'chain_simp_tail': |
1099 | 1112 | setChainClosed(bl.closed); |
1100 | 1113 | bl_chains_x[bl.index].pop(); |
1101 | | - bl_chains_x[bl.index][bl_chains_x[bl.index].length - 1] = bl.seg; |
| 1114 | + bl_chains_x[bl.index][bl_chains_x[bl.index].length - 1] = bl.sf; |
1102 | 1115 | break; |
1103 | 1116 | case 'chain_simp_close': |
1104 | 1117 | setChainClosed(bl.closed); |
1105 | 1118 | bl_chains_x[bl.index].pop(); |
1106 | 1119 | bl_chains_x[bl.index].shift(); |
1107 | | - bl_chains_x[bl.index].unshift(bl.seg); |
| 1120 | + bl_chains_x[bl.index].unshift(bl.sf); |
1108 | 1121 | break; |
1109 | 1122 | case 'chain_simp_join': |
1110 | 1123 | setChainClosed(bl.closed); |
1111 | 1124 | bl_chains_x[bl.index1].pop(); |
1112 | 1125 | bl_chains_x[bl.index2].shift(); |
1113 | | - bl_chains_x[bl.index1].push(bl.seg); |
| 1126 | + bl_chains_x[bl.index1].push(bl.sf); |
1114 | 1127 | break; |
1115 | 1128 | case 'chain_match': |
1116 | 1129 | bl_last_seg_keep_match = { i: bl.index, c: bl.closed }; |
|
1387 | 1400 | ); |
1388 | 1401 | } |
1389 | 1402 |
|
1390 | | - function drawChains(bl_chains, bl_chainids, color) { |
| 1403 | + function drawChains(bl_chains, bl_chainids, color, fillFlagColor) { |
1391 | 1404 | bl_chains.forEach(function(ch, chi){ |
1392 | 1405 | var rad = 3; |
1393 | 1406 | for (var i = 0; i < ch.length; i++){ |
1394 | | - const seg = ch[i]; |
| 1407 | + const seg = ch[i].seg; |
1395 | 1408 | var pt1 = segStart(seg); |
1396 | 1409 | var pt2 = segEnd(seg); |
1397 | 1410 | drawarrow(seg, rad); |
1398 | 1411 | ctx.lineWidth = 1; |
1399 | 1412 | ctx.strokeStyle = color; |
1400 | 1413 | ctx.stroke(); |
1401 | 1414 |
|
| 1415 | + if (fillFlagColor) { |
| 1416 | + const m1 = segPoint(seg, 0.49); |
| 1417 | + const m2 = segPoint(seg, 0.51); |
| 1418 | + var ang = Math.atan2(m2[1] - m1[1], m2[0] - m1[0]) + Math.PI / 2; |
| 1419 | + const dist = ch[i].fill ? 6 : -6; |
| 1420 | + ctx.beginPath(); |
| 1421 | + ctx.arc( |
| 1422 | + dist * Math.cos(ang) + (m1[0] + m2[0]) / 2, |
| 1423 | + dist * Math.sin(ang) + (m1[1] + m2[1]) / 2, |
| 1424 | + 3, |
| 1425 | + 0, Math.PI * 2 |
| 1426 | + ); |
| 1427 | + ctx.fillStyle = fillFlagColor; |
| 1428 | + ctx.fill(); |
| 1429 | + } |
| 1430 | + |
1402 | 1431 | ctx.beginPath(); |
1403 | 1432 | ctx.arc(pt1[0], pt1[1], rad, 0, Math.PI * 2); |
1404 | 1433 | ctx.fillStyle = color; |
|
1416 | 1445 | } |
1417 | 1446 | }); |
1418 | 1447 | } |
1419 | | - drawChains(bl_chains_o, bl_chainids_o, '#777'); |
1420 | | - drawChains(bl_chains_c, bl_chainids_c, '#070'); |
| 1448 | + drawChains(bl_chains_o, bl_chainids_o, '#777', false); |
| 1449 | + drawChains(bl_chains_c, bl_chainids_c, '#070', '#060'); |
1421 | 1450 |
|
1422 | 1451 | if (bl_last_seg_keep){ |
1423 | | - var pt1 = segStart(bl_last_seg_keep.seg); |
1424 | | - var pt2 = segEnd(bl_last_seg_keep.seg); |
| 1452 | + var pt1 = segStart(bl_last_seg_keep.sf.seg); |
| 1453 | + var pt2 = segEnd(bl_last_seg_keep.sf.seg); |
1425 | 1454 | const color = bl_last_seg_keep.closed ? '#0f0' : '#aaa'; |
1426 | 1455 | ctx.beginPath(); |
1427 | | - drawarrow(bl_last_seg_keep.seg, 3.5); |
| 1456 | + drawarrow(bl_last_seg_keep.sf.seg, 3.5); |
1428 | 1457 | ctx.lineWidth = 2; |
1429 | 1458 | ctx.strokeStyle = color; |
1430 | 1459 | ctx.stroke(); |
|
0 commit comments