选择框 投影点

pull/7/head
ChenX 7 years ago
parent 214b747245
commit 8ed28d2ef1

@ -0,0 +1,14 @@
import { Vector3Ext } from '../../src/Geometry/Vector3Ext';
import * as THREE from "three";
test("测试平行", () =>
{
let v1 = new Vector3Ext(0, 0, 1);
let v2 = new Vector3Ext(0.0001, 0, 1);
expect(v1.isParallelTo(v2)).toBe(false);
expect(v1.equals(new THREE.Vector3(0, 0, 1))).toBe(true);
expect(v2.equals(new THREE.Vector3(0.0001, 0, 1))).toBe(true);
// console.log(v1.isParallelTo(v2));
// console.log(v1);
// console.log(v2);
})

@ -2,6 +2,7 @@ import { Vector3, Matrix4 } from 'three';
import { Entity } from '../DatabaseServices/Entity'; import { Entity } from '../DatabaseServices/Entity';
import * as THREE from 'three'; import * as THREE from 'three';
import { PlaneExt } from '../Geometry/Plane'; import { PlaneExt } from '../Geometry/Plane';
import { GeUtils } from '../Geometry/GeUtils';
// //
@ -25,6 +26,7 @@ export class SelectBox
// m_Min: Vector3; // m_Min: Vector3;
// m_Max: Vector3; // m_Max: Vector3;
private m_SelPolyPtsBuff: Map<string, Array<Vector3>> = new Map<string, Array<Vector3>>();
/** /**
* . * .
@ -35,15 +37,20 @@ export class SelectBox
*/ */
getProjectionPts(planDir: THREE.Vector3): Array<Vector3> getProjectionPts(planDir: THREE.Vector3): Array<Vector3>
{ {
if (GeUtils.isParallelTo(planDir, this.m_ViewNormal))
return [];
let dirStr = GeUtils.ptToString(planDir);
if (this.m_SelPolyPtsBuff.has(dirStr))
return this.m_SelPolyPtsBuff.get(dirStr)
let plan = new PlaneExt(planDir); let plan = new PlaneExt(planDir);
this.m_SelPolyPts.map(p => let pts = this.m_SelPolyPts.map(p =>
{ {
let l = new THREE.Line3(p, p.clone().add(this.m_ViewNormal)); let l = new THREE.Line3(p, p.clone().add(this.m_ViewNormal));
return plan.intersectLine(l, null, true); return plan.intersectLine(l, null, true);
}) });
return []; this.m_SelPolyPtsBuff.set(dirStr, pts);
return pts;
} }
} }
export class SelectSet export class SelectSet
@ -57,3 +64,4 @@ export class SelectSet
m_SelectBox: SelectBox; m_SelectBox: SelectBox;
} }

@ -1,6 +1,7 @@
import { Vector3, Matrix4 } from 'three'; import { Vector3, Matrix4 } from 'three';
import * as THREE from 'three'; import * as THREE from 'three';
namespace GeUtils import { Vector3Ext } from './Vector3Ext';
export namespace GeUtils
{ {
export const cZeroVec = new THREE.Vector3(); export const cZeroVec = new THREE.Vector3();
@ -41,5 +42,27 @@ namespace GeUtils
mat.lookAt(cZeroVec, dir, up); mat.lookAt(cZeroVec, dir, up);
return mat; return mat;
} }
export function isParallelTo(v1: THREE.Vector3, v2: THREE.Vector3)
{
let vx1 = new Vector3Ext().copy(v1);
let vx2 = new Vector3Ext().copy(v2);
return vx1.isParallelTo(vx2);
}
export function ptToString(v: THREE.Vector3, fractionDigits: number = 3): string
{
return v.toArray().map(o =>
{
return o.toFixed(fractionDigits)
}).join(",")
}
} }
let v = new THREE.Vector3(1.224444444)
let s = GeUtils.ptToString(v);
console.log(s);

@ -0,0 +1,24 @@
import * as THREE from "three";
export class Vector3Ext extends THREE.Vector3
{
constructor(x?: number, y?: number, z?: number)
{
super(x, y, z);
}
/**
* ,1e-5.
*
* @export
* @param {THREE.Vector3} v
* @returns {boolean}
*/
isParallelTo(v: Vector3Ext): boolean
{
let v2 = this.clone().cross(v);
return v2.lengthSq() < 1e-10;
}
}
Loading…
Cancel
Save