fix(modeling/layout): handle zero-length lines during adjustment
Closes #669
This commit is contained in:
parent
3de5478d04
commit
2fd46ac294
|
@ -74,16 +74,16 @@ function getAttachment(point, line) {
|
||||||
segmentEnd = line[idx + 1];
|
segmentEnd = line[idx + 1];
|
||||||
|
|
||||||
if (pointsEqual(segmentStart, segmentEnd)) {
|
if (pointsEqual(segmentStart, segmentEnd)) {
|
||||||
continue;
|
intersections = [ segmentStart ];
|
||||||
|
} else {
|
||||||
|
segmentStartDistance = getDistance(point, segmentStart);
|
||||||
|
segmentEndDistance = getDistance(point, segmentEnd);
|
||||||
|
|
||||||
|
minDistance = min(segmentStartDistance, segmentEndDistance);
|
||||||
|
|
||||||
|
intersections = getCircleSegmentIntersections(segmentStart, segmentEnd, point, minDistance);
|
||||||
}
|
}
|
||||||
|
|
||||||
segmentStartDistance = getDistance(point, segmentStart);
|
|
||||||
segmentEndDistance = getDistance(point, segmentEnd);
|
|
||||||
|
|
||||||
minDistance = min(segmentStartDistance, segmentEndDistance);
|
|
||||||
|
|
||||||
intersections = getCircleSegmentIntersections(segmentStart, segmentEnd, point, minDistance);
|
|
||||||
|
|
||||||
if (intersections.length < 1) {
|
if (intersections.length < 1) {
|
||||||
throw new Error('expected between [1, 2] circle -> line intersections');
|
throw new Error('expected between [1, 2] circle -> line intersections');
|
||||||
}
|
}
|
||||||
|
@ -222,6 +222,12 @@ function roundPoint(p) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var EQUAL_THRESHOLD = 0.2;
|
||||||
|
|
||||||
function pointsEqual(p1, p2) {
|
function pointsEqual(p1, p2) {
|
||||||
return p1.x === p2.x && p1.y === p2.y;
|
|
||||||
|
return (
|
||||||
|
Math.abs(p1.x - p2.x) <= EQUAL_THRESHOLD &&
|
||||||
|
Math.abs(p1.y - p2.y) <= EQUAL_THRESHOLD
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ var getAttachment = require('lib/features/modeling/behavior/util/LineAttachmentU
|
||||||
|
|
||||||
var EPSILON = 0.1;
|
var EPSILON = 0.1;
|
||||||
|
|
||||||
|
|
||||||
describe('modeling/behavior/util - LineAttachmentUtil#getAttachment', function() {
|
describe('modeling/behavior/util - LineAttachmentUtil#getAttachment', function() {
|
||||||
|
|
||||||
// test line
|
// test line
|
||||||
|
@ -198,7 +199,7 @@ describe('modeling/behavior/util - LineAttachmentUtil#getAttachment', function()
|
||||||
// \
|
// \
|
||||||
// *
|
// *
|
||||||
//
|
//
|
||||||
var otherLine = [
|
var floatingPointLine = [
|
||||||
{ x: 10.141592, y: 10.653589 },
|
{ x: 10.141592, y: 10.653589 },
|
||||||
// -
|
// -
|
||||||
{ x: 30.793238, y: 10.462643 },
|
{ x: 30.793238, y: 10.462643 },
|
||||||
|
@ -212,7 +213,7 @@ describe('modeling/behavior/util - LineAttachmentUtil#getAttachment', function()
|
||||||
it('float value segment', function() {
|
it('float value segment', function() {
|
||||||
|
|
||||||
// when
|
// when
|
||||||
var attachment = getAttachment({ x: 20.197169, y: 5.399375 }, otherLine);
|
var attachment = getAttachment({ x: 20.197169, y: 5.399375 }, floatingPointLine);
|
||||||
|
|
||||||
// then
|
// then
|
||||||
expect(attachment.type).to.equal('segment');
|
expect(attachment.type).to.equal('segment');
|
||||||
|
@ -228,7 +229,7 @@ describe('modeling/behavior/util - LineAttachmentUtil#getAttachment', function()
|
||||||
it('float value bendboint', function() {
|
it('float value bendboint', function() {
|
||||||
|
|
||||||
// when
|
// when
|
||||||
var attachment = getAttachment({ x: 35.197169, y: 5.399375 }, otherLine);
|
var attachment = getAttachment({ x: 35.197169, y: 5.399375 }, floatingPointLine);
|
||||||
|
|
||||||
// then
|
// then
|
||||||
// expext values to be rounded to 3 decimal places
|
// expext values to be rounded to 3 decimal places
|
||||||
|
@ -243,4 +244,52 @@ describe('modeling/behavior/util - LineAttachmentUtil#getAttachment', function()
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
describe('handle zero-length line', function() {
|
||||||
|
|
||||||
|
var zeroLengthLine = [
|
||||||
|
{ x: 10, y: 10 },
|
||||||
|
// -
|
||||||
|
{ x: 10, y: 10 }
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
var zeroLengthFloatingPointLine = [
|
||||||
|
{ x: 10.1, y: 10.12313 },
|
||||||
|
// -
|
||||||
|
{ x: 10, y: 10.112 }
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
it('should treat zero-length as bendpoint attach', function() {
|
||||||
|
|
||||||
|
// when
|
||||||
|
var attachment = getAttachment({ x: 15.1, y: 15.123 }, zeroLengthLine);
|
||||||
|
|
||||||
|
// then
|
||||||
|
expect(attachment).to.eql({
|
||||||
|
type: 'bendpoint',
|
||||||
|
position: { x: 10, y: 10 },
|
||||||
|
segmentIndex: 0,
|
||||||
|
bendpointIndex: 0
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
it('should treat approx zero-length as bendpoint attach', function() {
|
||||||
|
|
||||||
|
// when
|
||||||
|
var attachment = getAttachment({ x: 15.1, y: 15.123 }, zeroLengthFloatingPointLine);
|
||||||
|
|
||||||
|
// then
|
||||||
|
expect(attachment).to.eql({
|
||||||
|
type: 'bendpoint',
|
||||||
|
position: { x: 10.1, y: 10.12313 },
|
||||||
|
segmentIndex: 0,
|
||||||
|
bendpointIndex: 0
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue