document.write("");
document.write("");
document.write("");
document.write("");
document.write("");
document.write("");
document.write("");
document.write("");
document.write("");
document.write("");
document.write("");
document.write("");
//通过三个点得到圆心、半径、开始弧度、弧长
function getArcInfpByThreePt(mFirstPt, mSecondPt, mThirdPt) {
var mTempX1 = mFirstPt.x - mSecondPt.x;
var mTempY1 = mFirstPt.y - mSecondPt.y;
var mTempX2 = mFirstPt.x - mThirdPt.x;
var mTempY2 = mFirstPt.y - mThirdPt.y;
var mTemp1 =
(
(Math.pow(mFirstPt.x, 2) - Math.pow(mSecondPt.x, 2)) -
(Math.pow(mSecondPt.y, 2) - Math.pow(mFirstPt.y, 2))
)
/ 2;
var mTemp2 =
(
(Math.pow(mFirstPt.x, 2) - Math.pow(mThirdPt.x, 2)) -
(Math.pow(mThirdPt.y, 2) - Math.pow(mFirstPt.y, 2))
)
/ 2;
var mCenter = new THREE.Vector3(0, 0, 0);
mCenter.x = -(
(mTempY2 * mTemp1 - mTempY1 * mTemp2) /
(mTempY1 * mTempX2 - mTempX1 * mTempY2)
);
mCenter.y = -(
(mTempX1 * mTemp2 - mTempX2 * mTemp1) /
(mTempY1 * mTempX2 - mTempX1 * mTempY2)
);
mCenter.z = mFirstPt.z;
var mVec1 = new THREE.Vector3(0, 0, 0);
var mVec2 = new THREE.Vector3(0, 0, 0);
var mVec3 = new THREE.Vector3(0, 0, 0);
mVec1.subVectors(mFirstPt, mCenter);
mVec2.subVectors(mSecondPt, mCenter);
mVec3.subVectors(mThirdPt, mCenter);
var mAxisX = new THREE.Vector3(1, 0, 0);
var dAngles = new Array()
dAngles[0] = mVec1.angleTo(mAxisX);
dAngles[1] = mVec2.angleTo(mAxisX);
dAngles[2] = mVec3.angleTo(mAxisX);
if (mFirstPt.y < mCenter.y) {
dAngles[0] = 2 * Math.PI - dAngles[0];
}
if (mSecondPt.y < mCenter.y) {
dAngles[1] = 2 * Math.PI - dAngles[1];
}
if (mThirdPt.y < mCenter.y) {
dAngles[2] = 2 * Math.PI - dAngles[2];
}
dAngles.sort();
return [mCenter, mVec1.length(), dAngles[0], (dAngles[2] - dAngles[1]) + (dAngles[1] - dAngles[0])];
}
//屏幕坐标到世界坐标
function ScreenCRD2WorldCRD(x, y, z) {
return MxFun.screenCoord2World(x,y,z);
}
//世界坐标到屏幕坐标
function WorldCRD2ScreenCRD(x, y, z) {
return MxFun.worldCoord2Screen(x,y,z);
}
function getTriangle(sName, vPt1, vPt2, vPt3, iColor) {
var material = new THREE.MeshBasicMaterial({ color: iColor, side: THREE.DoubleSide});
//create a triangular geometry
//创建几何体的三个顶点
var geometry = new THREE.Geometry();
geometry.vertices.push(vPt1);
geometry.vertices.push(vPt2);
geometry.vertices.push(vPt3);
//create a new face using vertices 0, 1, 2
//使用顶点0, 1, 2创建一个三角面face
var normal = new THREE.Vector3(1, 1, 1);
var color = new THREE.Color(iColor); //optional
var materialIndex = 0; //optional
var face = new THREE.Face3(0, 1, 2, normal, color, materialIndex);
//add the face to the geometry's faces array
//把三角面对象Face3添加到几何体对象Geometry的faces属性中
geometry.faces.push(face);
//the face normals and vertex normals can be calculated automatically if not supplied above
//如果没有定义,三角面的法向量和顶点的法向量系统会自动计算
geometry.computeFaceNormals();
geometry.computeVertexNormals();
var mTriangle = new THREE.Mesh(geometry, material);
mTriangle.name = sName;
return mTriangle;
}
/* 创建圆弧 */
function addArc(sName, mCenterPt, dRadius, mStartAngle, mEndAngle, iColor) {
var mEnt = getArc(sName, mCenterPt, dRadius, mStartAngle, mEndAngle, iColor);
var scene = MxManager.currentMx().getScene();
scene.add(mEnt);
}
function getArc(sName, mCenterPt, dRadius, mStartAngle, mEndAngle, iColor) {
var geometry = new THREE.CircleGeometry(dRadius, 64, mStartAngle, mEndAngle);
var material = new THREE.LineBasicMaterial({ color: iColor });
// Remove center vertex
geometry.vertices.shift();
var mLine = new THREE.Line(geometry, material);
mLine.position.x = mCenterPt.x;
mLine.position.y = mCenterPt.y;
mLine.position.z = mCenterPt.z;
mLine.name = sName;
return mLine;
}
/* 创建线段 */
function addLine(sName, vPt1, vPt2, iColor) {
var mEnt = getLine(sName, vPt1, vPt2, iColor);
var scene = MxManager.currentMx().getScene();
scene.add(mEnt);
}
function getLine(sName, vPt1, vPt2, iColor) {
var lineGeometry = new THREE.Geometry();
var lineMaterial = new THREE.LineBasicMaterial({ color: iColor });
lineGeometry.vertices.push(vPt1, vPt2);
var mLine = new THREE.Line(lineGeometry, lineMaterial);
mLine.name = sName;
return mLine;
}
/* 创建圆 */
function addCircle(sName, mCenterPt, dRadius, iColor) {
var mEnt = getCircle(sName, mCenterPt, dRadius, iColor);
var scene = MxManager.currentMx().getScene();
scene.add(mEnt);
}
function getCircle(sName, mCenterPt, dRadius, iColor) {
var geometry = new THREE.CircleGeometry(dRadius, 64, 3, 2 * Math.PI);
var material = new THREE.LineBasicMaterial({ color: iColor });
// Remove center vertex
geometry.vertices.shift();
var mLine = new THREE.LineLoop(geometry, material);
mLine.position.x = mCenterPt.x;
mLine.position.y = mCenterPt.y;
mLine.position.z = mCenterPt.z;
mLine.name = sName;
return mLine;
}
/* 创建Spline */
function addSpline(sName, vPts, iColor){
var mEnt = getSpline(sName, vPts, iColor);
var scene = MxManager.currentMx().getScene();
scene.add(mEnt);
}
function getSpline(sName, vPts, iColor) {
var curve = new THREE.SplineCurve3();
for (var i = 0; i < vPts.length; i++)
{
curve.points.push(vPts[i]);
}
var geometry = new THREE.Geometry();
if (1 < vPts.length)
{
geometry.vertices = curve.getPoints(curve.points.length * 10);
}
var material = new THREE.LineBasicMaterial({color : 0X00FF00});
var line = new THREE.Line(geometry, material);
line.name = sName;
return line;
}
/* 创建Polyline */
function addPolyline(sName, vPts, iColor)
{
var mEnt = getPolyline(sName, vPts, iColor);
var scene = MxManager.currentMx().getScene();
scene.add(mEnt);
}
function getPolyline(sName, vPts, iColor)
{
var geometry = new THREE.Geometry();
for (var i = 0; i < vPts.length; i++)
{
geometry.vertices.push(vPts[i]);
}
var material = new THREE.LineBasicMaterial({color : 0X00FF00});
var line = new THREE.Line(geometry, material);
line.name = sName;
return line;
}
/* 创建Point */
function addPoint(sName, mPt, iColor)
{
var mEnt = getPoint(sName, mPt);
var scene = MxManager.currentMx().getScene();
scene.add(mEnt);
}
function getPoint(sName, mPt, iColor)
{
var pointsGeometry = new THREE.Geometry();
pointsGeometry.vertices.push(mPt);
var pointsMaterial = new THREE.PointsMaterial({color:0xff0000, size: 3});
var points = new THREE.Points(pointsGeometry, pointsMaterial);
points.name = sName;
return points;
}
/* 创建Text */
function addText(sName, sText, iSize, dAngle, mPt, iColor)
{
var mEnt = getText(sName, sText, iSize, dAngle, mPt, iColor);
var scene = MxManager.currentMx().getScene();
scene.add(mEnt);
}
function removeEntByName(sName) {
var mTargetLine = MxManager.currentMx().getScene().getObjectByName(sName);
var scene = MxManager.currentMx().getScene();
scene.remove(mTargetLine);
}
function makeTextSprite(sName, message, pt, iSize, fAngle, iColor) {
var canvas = document.createElement('canvas'),
context = canvas.getContext('2d'),
metrics = null,
textHeight = iSize,
textWidth = 0,
actualFontSize = 2;
var sFont = 'normal {0}px Arial'.format(textHeight);
context.font = sFont;
metrics = context.measureText(message);
textWidth = metrics.width;
canvas.width = textWidth;
canvas.height = textHeight;
sFont = 'normal {0}px Arial'.format(textHeight);
context.font = sFont;
context.textAlign = "center";
context.textBaseline = "middle";
var sColor = '#{0}'.format(iColor);
context.fillStyle = "#00FF00";
context.fillText(message, textWidth / 2, textHeight / 2);
var texture = new THREE.Texture(canvas);
texture.needsUpdate = true;
var material = new THREE.SpriteMaterial({
map: texture,
useScreenCoordinates: false
});
material.transparent = true;
material.rotation = fAngle;
var textObject = new THREE.Object3D();
var sprite = new THREE.Sprite(material);
textObject.textHeight = actualFontSize;
textObject.textWidth = (textWidth / textHeight) * textObject.textHeight;
sprite.scale.set(0.05 * iSize, 0.025 * iSize, 0);
sprite.position.set(pt.x, pt.y, 0);
textObject.add(sprite);
textObject.name = sName;
return textObject;
}
function getPoint(sName, mPt, iColor) {
var pointsGeometry = new THREE.Geometry();
pointsGeometry.vertices.push(mPt);
var pointsMaterial = new THREE.PointsMaterial({ color: iColor, size: 1 });
var points = new THREE.Points(pointsGeometry, pointsMaterial);
points.name = sName;
return points;
}
function getLenByScreenCoord(fLen) {
var mTextSize1 = Math.abs(ScreenCRD2WorldCRD(new THREE.Vector3(document.body.clientWidth, 0, 0)).x);
var mTextSize2 = Math.abs(ScreenCRD2WorldCRD(new THREE.Vector3(document.body.clientWidth - fLen, 0, 0)).x);
return Math.abs(mTextSize1 - mTextSize2);
}
String.prototype.format = function () {
var values = arguments;
return this.replace(/\{(\d+)\}/g, function (match, index) {
if (values.length > index) {
return values[index];
} else {
return "";
}
});
};