Add segment class and utilities.
This commit is contained in:
parent
3022673c5e
commit
554d0b6108
@ -33,3 +33,8 @@ export function CoordDistance2D (a, b)
|
|||||||
{
|
{
|
||||||
return Math.sqrt ((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
|
return Math.sqrt ((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function DotVector2D (a, b)
|
||||||
|
{
|
||||||
|
return a.x * b.x + a.y * b.y;
|
||||||
|
}
|
||||||
|
|||||||
39
source/engine/geometry/line2d.js
Normal file
39
source/engine/geometry/line2d.js
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
import { Coord2D, CoordDistance2D, DotVector2D, SubCoord2D } from './coord2d.js';
|
||||||
|
import { IsZero } from './geometry.js';
|
||||||
|
|
||||||
|
export class Segment2D
|
||||||
|
{
|
||||||
|
constructor (beg, end)
|
||||||
|
{
|
||||||
|
this.beg = beg;
|
||||||
|
this.end = end;
|
||||||
|
}
|
||||||
|
|
||||||
|
Clone ()
|
||||||
|
{
|
||||||
|
return new Segment2D (this.beg, this.end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function ProjectPointToSegment2D (segment, point)
|
||||||
|
{
|
||||||
|
let begToEndVec = SubCoord2D (segment.end, segment.beg);
|
||||||
|
let begToPointVec = SubCoord2D (point, segment.beg);
|
||||||
|
let nom = DotVector2D (begToEndVec, begToPointVec);
|
||||||
|
let denom = DotVector2D (begToEndVec, begToEndVec);
|
||||||
|
if (IsZero (denom)) {
|
||||||
|
return segment.beg.Clone ();
|
||||||
|
}
|
||||||
|
let t = nom / denom;
|
||||||
|
t = Math.max (0.0, Math.min (1.0, t));
|
||||||
|
return new Coord2D (
|
||||||
|
segment.beg.x + t * begToEndVec.x,
|
||||||
|
segment.beg.y + t * begToEndVec.y
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function SegmentPointDistance2D (segment, point)
|
||||||
|
{
|
||||||
|
let projected = ProjectPointToSegment2D (segment, point);
|
||||||
|
return CoordDistance2D (projected, point);
|
||||||
|
}
|
||||||
@ -12,10 +12,11 @@ import { ExporterOff } from './export/exporteroff.js';
|
|||||||
import { ExporterPly } from './export/exporterply.js';
|
import { ExporterPly } from './export/exporterply.js';
|
||||||
import { ExporterStl } from './export/exporterstl.js';
|
import { ExporterStl } from './export/exporterstl.js';
|
||||||
import { Box3D, BoundingBoxCalculator3D } from './geometry/box3d.js';
|
import { Box3D, BoundingBoxCalculator3D } from './geometry/box3d.js';
|
||||||
import { Coord2D, CoordIsEqual2D, AddCoord2D, SubCoord2D, CoordDistance2D } from './geometry/coord2d.js';
|
import { Coord2D, CoordIsEqual2D, AddCoord2D, SubCoord2D, CoordDistance2D, DotVector2D } from './geometry/coord2d.js';
|
||||||
import { Coord3D, CoordIsEqual3D, AddCoord3D, SubCoord3D, CoordDistance3D, DotVector3D, VectorAngle3D, CrossVector3D, VectorLength3D, ArrayToCoord3D } from './geometry/coord3d.js';
|
import { Coord3D, CoordIsEqual3D, AddCoord3D, SubCoord3D, CoordDistance3D, DotVector3D, VectorAngle3D, CrossVector3D, VectorLength3D, ArrayToCoord3D } from './geometry/coord3d.js';
|
||||||
import { Coord4D } from './geometry/coord4d.js';
|
import { Coord4D } from './geometry/coord4d.js';
|
||||||
import { IsZero, IsLower, IsGreater, IsLowerOrEqual, IsGreaterOrEqual, IsEqual, IsEqualEps, IsPositive, IsNegative, Eps, BigEps, RadDeg, DegRad, Direction } from './geometry/geometry.js';
|
import { IsZero, IsLower, IsGreater, IsLowerOrEqual, IsGreaterOrEqual, IsEqual, IsEqualEps, IsPositive, IsNegative, Eps, BigEps, RadDeg, DegRad, Direction } from './geometry/geometry.js';
|
||||||
|
import { Segment2D, ProjectPointToSegment2D, SegmentPointDistance2D } from './geometry/line2d.js';
|
||||||
import { Matrix, MatrixIsEqual } from './geometry/matrix.js';
|
import { Matrix, MatrixIsEqual } from './geometry/matrix.js';
|
||||||
import { OctreeNode, Octree } from './geometry/octree.js';
|
import { OctreeNode, Octree } from './geometry/octree.js';
|
||||||
import { Quaternion, QuaternionIsEqual, ArrayToQuaternion, QuaternionFromAxisAngle, QuaternionFromXYZ } from './geometry/quaternion.js';
|
import { Quaternion, QuaternionIsEqual, ArrayToQuaternion, QuaternionFromAxisAngle, QuaternionFromXYZ } from './geometry/quaternion.js';
|
||||||
@ -105,6 +106,7 @@ export {
|
|||||||
AddCoord2D,
|
AddCoord2D,
|
||||||
SubCoord2D,
|
SubCoord2D,
|
||||||
CoordDistance2D,
|
CoordDistance2D,
|
||||||
|
DotVector2D,
|
||||||
Coord3D,
|
Coord3D,
|
||||||
CoordIsEqual3D,
|
CoordIsEqual3D,
|
||||||
AddCoord3D,
|
AddCoord3D,
|
||||||
@ -130,6 +132,9 @@ export {
|
|||||||
RadDeg,
|
RadDeg,
|
||||||
DegRad,
|
DegRad,
|
||||||
Direction,
|
Direction,
|
||||||
|
Segment2D,
|
||||||
|
ProjectPointToSegment2D,
|
||||||
|
SegmentPointDistance2D,
|
||||||
Matrix,
|
Matrix,
|
||||||
MatrixIsEqual,
|
MatrixIsEqual,
|
||||||
OctreeNode,
|
OctreeNode,
|
||||||
|
|||||||
@ -63,6 +63,62 @@ describe ('Coord', function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe ('Segment', function () {
|
||||||
|
it ('Projected point', function () {
|
||||||
|
let segment = new OV.Segment2D (new OV.Coord2D (0.0, 0.0), new OV.Coord2D (10.0, 0.0));
|
||||||
|
|
||||||
|
assert.ok (OV.CoordIsEqual2D (OV.ProjectPointToSegment2D (segment, new OV.Coord2D (-2.0, 0.0)), new OV.Coord2D (0.0, 0.0)));
|
||||||
|
assert.ok (OV.CoordIsEqual2D (OV.ProjectPointToSegment2D (segment, new OV.Coord2D (0.0, 0.0)), new OV.Coord2D (0.0, 0.0)));
|
||||||
|
assert.ok (OV.CoordIsEqual2D (OV.ProjectPointToSegment2D (segment, new OV.Coord2D (2.0, 0.0)), new OV.Coord2D (2.0, 0.0)));
|
||||||
|
assert.ok (OV.CoordIsEqual2D (OV.ProjectPointToSegment2D (segment, new OV.Coord2D (8.0, 0.0)), new OV.Coord2D (8.0, 0.0)));
|
||||||
|
assert.ok (OV.CoordIsEqual2D (OV.ProjectPointToSegment2D (segment, new OV.Coord2D (10.0, 0.0)), new OV.Coord2D (10.0, 0.0)));
|
||||||
|
assert.ok (OV.CoordIsEqual2D (OV.ProjectPointToSegment2D (segment, new OV.Coord2D (12.0, 0.0)), new OV.Coord2D (10.0, 0.0)));
|
||||||
|
|
||||||
|
assert.ok (OV.CoordIsEqual2D (OV.ProjectPointToSegment2D (segment, new OV.Coord2D (-2.0, 10.0)), new OV.Coord2D (0.0, 0.0)));
|
||||||
|
assert.ok (OV.CoordIsEqual2D (OV.ProjectPointToSegment2D (segment, new OV.Coord2D (0.0, 10.0)), new OV.Coord2D (0.0, 0.0)));
|
||||||
|
assert.ok (OV.CoordIsEqual2D (OV.ProjectPointToSegment2D (segment, new OV.Coord2D (2.0, 10.0)), new OV.Coord2D (2.0, 0.0)));
|
||||||
|
assert.ok (OV.CoordIsEqual2D (OV.ProjectPointToSegment2D (segment, new OV.Coord2D (8.0, 10.0)), new OV.Coord2D (8.0, 0.0)));
|
||||||
|
assert.ok (OV.CoordIsEqual2D (OV.ProjectPointToSegment2D (segment, new OV.Coord2D (10.0, 10.0)), new OV.Coord2D (10.0, 0.0)));
|
||||||
|
assert.ok (OV.CoordIsEqual2D (OV.ProjectPointToSegment2D (segment, new OV.Coord2D (12.0, 10.0)), new OV.Coord2D (10.0, 0.0)));
|
||||||
|
});
|
||||||
|
|
||||||
|
it ('Projected point on invalid segment', function () {
|
||||||
|
let segment = new OV.Segment2D (new OV.Coord2D (0.0, 0.0), new OV.Coord2D (0.0, 0.0));
|
||||||
|
|
||||||
|
assert.ok (OV.CoordIsEqual2D (OV.ProjectPointToSegment2D (segment, new OV.Coord2D (0.0, 0.0)), new OV.Coord2D (0.0, 0.0)));
|
||||||
|
assert.ok (OV.CoordIsEqual2D (OV.ProjectPointToSegment2D (segment, new OV.Coord2D (10.0, 0.0)), new OV.Coord2D (0.0, 0.0)));
|
||||||
|
assert.ok (OV.CoordIsEqual2D (OV.ProjectPointToSegment2D (segment, new OV.Coord2D (0.0, 10.0)), new OV.Coord2D (0.0, 0.0)));
|
||||||
|
});
|
||||||
|
|
||||||
|
it ('Segment and point distance', function () {
|
||||||
|
let segment = new OV.Segment2D (new OV.Coord2D (0.0, 0.0), new OV.Coord2D (0.0, 10.0));
|
||||||
|
|
||||||
|
assert.ok (OV.IsEqual (OV.SegmentPointDistance2D (segment, new OV.Coord2D (0.0, 0.0)), 0.0));
|
||||||
|
assert.ok (OV.IsEqual (OV.SegmentPointDistance2D (segment, new OV.Coord2D (0.0, 2.0)), 0.0));
|
||||||
|
assert.ok (OV.IsEqual (OV.SegmentPointDistance2D (segment, new OV.Coord2D (0.0, 8.0)), 0.0));
|
||||||
|
assert.ok (OV.IsEqual (OV.SegmentPointDistance2D (segment, new OV.Coord2D (0.0, 10.0)), 0.0));
|
||||||
|
|
||||||
|
assert.ok (OV.IsEqual (OV.SegmentPointDistance2D (segment, new OV.Coord2D (-2.0, 0.0)), 2.0));
|
||||||
|
assert.ok (OV.IsEqual (OV.SegmentPointDistance2D (segment, new OV.Coord2D (-4.0, 2.0)), 4.0));
|
||||||
|
assert.ok (OV.IsEqual (OV.SegmentPointDistance2D (segment, new OV.Coord2D (6.0, 8.0)), 6.0));
|
||||||
|
assert.ok (OV.IsEqual (OV.SegmentPointDistance2D (segment, new OV.Coord2D (8.0, 10.0)), 8.0));
|
||||||
|
|
||||||
|
assert.ok (OV.IsEqual (OV.SegmentPointDistance2D (segment, new OV.Coord2D (0.0, -2.0)), 2.0));
|
||||||
|
assert.ok (OV.IsEqual (OV.SegmentPointDistance2D (segment, new OV.Coord2D (0.0, 12.0)), 2.0));
|
||||||
|
});
|
||||||
|
|
||||||
|
it ('Segment and point distance 2', function () {
|
||||||
|
let segment = new OV.Segment2D (new OV.Coord2D (2.0, 2.0), new OV.Coord2D (4.0, 4.0));
|
||||||
|
|
||||||
|
assert.ok (OV.IsEqual (OV.SegmentPointDistance2D (segment, new OV.Coord2D (2.0, 2.0)), 0.0));
|
||||||
|
assert.ok (OV.IsEqual (OV.SegmentPointDistance2D (segment, new OV.Coord2D (3.0, 3.0)), 0.0));
|
||||||
|
assert.ok (OV.IsEqual (OV.SegmentPointDistance2D (segment, new OV.Coord2D (4.0, 4.0)), 0.0));
|
||||||
|
|
||||||
|
assert.ok (OV.IsEqual (OV.SegmentPointDistance2D (segment, new OV.Coord2D (4.0, 5.0)), 1.0));
|
||||||
|
assert.ok (OV.IsEqual (OV.SegmentPointDistance2D (segment, new OV.Coord2D (0.0, 2.0)), 2.0));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe ('Quaternion', function () {
|
describe ('Quaternion', function () {
|
||||||
it ('Create Quaternion', function () {
|
it ('Create Quaternion', function () {
|
||||||
let q1 = OV.QuaternionFromAxisAngle (new OV.Coord3D (1.0, 0.0, 0.0), Math.PI / 2.0);
|
let q1 = OV.QuaternionFromAxisAngle (new OV.Coord3D (1.0, 0.0, 0.0), Math.PI / 2.0);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user