mirror of
https://github.com/skishore/makemeahanzi.git
synced 2025-11-01 12:07:15 +08:00
Add bridge intersection points to stroke outline
This commit is contained in:
@ -319,6 +319,16 @@ function extract_stroke(paths, endpoint_map, bridge_adjacency,
|
||||
return endpoint_map[Point.key(index)].point;
|
||||
}
|
||||
|
||||
function push_line_segments(points) {
|
||||
for (var i = 0; i < points.length - 1; i++) {
|
||||
result.push({
|
||||
start: Point.clone(points[i]),
|
||||
end: Point.clone(points[i + 1]),
|
||||
control: undefined,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function select_bridge(endpoint, options) {
|
||||
if (options.length === 1) {
|
||||
// Handle star-shaped strokes where one stroke ends at the intersection
|
||||
@ -335,22 +345,25 @@ function extract_stroke(paths, endpoint_map, bridge_adjacency,
|
||||
}
|
||||
// Compute the other bridge segment and check if it intersects.
|
||||
var indices2 = [endpoint_map[key].index, bridge_adjacency[key][i]];
|
||||
var segment2 = indices2.map(index_to_point);
|
||||
if (Point.equal(indices2[0], indices1[1]) &&
|
||||
!extracted_indices[Point.key(indices2[1])]) {
|
||||
push_line_segments([segment1[0], segment1[1], segment2[1]]);
|
||||
return indices2[1];
|
||||
} else if (Point.equal(indices2[1], indices1[1]) &&
|
||||
!extracted_indices[Point.key(indices2[0])]) {
|
||||
push_line_segments([segment1[0], segment1[1], segment2[0]]);
|
||||
return indices2[0];
|
||||
}
|
||||
var segment2 = indices2.map(index_to_point);
|
||||
var intersection = get_intersection(segment1, segment2);
|
||||
if (intersection !== undefined) {
|
||||
var angle1 = angle(indices1[0], indices1[1]);
|
||||
var angle2 = angle(indices2[0], indices2[1]);
|
||||
var diff = Angle.subtract(angle2, angle1);
|
||||
if (diff < 0) {
|
||||
if (Angle.subtract(angle2, angle1) < 0) {
|
||||
indices2.reverse();
|
||||
segment2.reverse();
|
||||
}
|
||||
push_line_segments([segment1[0], intersection, segment2[1]]);
|
||||
return indices2[1];
|
||||
}
|
||||
}
|
||||
@ -382,12 +395,18 @@ function extract_stroke(paths, endpoint_map, bridge_adjacency,
|
||||
var options = bridge_adjacency[key].sort(function(a, b) {
|
||||
return angle(endpoint.index, a) - angle(endpoint.index, b);
|
||||
});
|
||||
// HACK(skishore): The call to select_bridge may update the result.
|
||||
// When a stroke is formed by computing a bridge intersection, then the
|
||||
// two bridge fragments are added in select_bridge.
|
||||
var result_length = result.length;
|
||||
var next = (attempt_one ? options[0] : select_bridge(endpoint, options));
|
||||
result.push({
|
||||
start: Point.clone(endpoint.point),
|
||||
end: Point.clone(endpoint_map[Point.key(next)].point),
|
||||
control: undefined,
|
||||
});
|
||||
if (result.length === result_length) {
|
||||
result.push({
|
||||
start: Point.clone(endpoint.point),
|
||||
end: Point.clone(endpoint_map[Point.key(next)].point),
|
||||
control: undefined,
|
||||
});
|
||||
}
|
||||
current = next;
|
||||
}
|
||||
// Check if we have either closed the loop or hit an extracted segment.
|
||||
|
||||
Reference in New Issue
Block a user