📄 coordinatesys.java
字号:
/*
* CoordinateSys.java
*
* Created on 2006年12月29日, 下午3:31
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package com.crscd.geometry;
import java.awt.Graphics;
import java.awt.*;
import java.awt.Rectangle;
import java.math.BigDecimal;
import java.util.ArrayList;
/**
*
* @author Administrator
*/
class Point3D
{
public double m_fX = 0.0f;
public double m_fY = 0.0f;
public double m_fZ = 0.0f;
public Point3D()
{
m_fX = 0.0f;
m_fY = 0.0f;
m_fZ = 0.0f;
}
}
class Symmetry
{
public int m_nX = 0;
public int m_nY = 0;
public int m_nZ = 0;
static public final int SYMMETRY_ONE = 0;
static public final int SYMMETRY_X_2 = 1;
static public final int SYMMETRY_Y_2 = 2;
static public final int SYMMETRY_Z_2 = 3;
}
class Validate
{
static public final int VALIDATE_NON = 0;
static public final int VALIDATE_ONE = 2;
static public final int VALIDATE_TWO = 1;
public int m_nX = 0;
public int m_nY = 0;
public int m_nZ = 0;
public Validate()
{
m_nX = VALIDATE_ONE;
m_nY = VALIDATE_ONE;
m_nZ = VALIDATE_ONE;
}
public Validate(int x,int y,int z)
{
m_nX = x;
m_nY = y;
m_nZ = z;
}
}
class ViewRange
{
public double m_fBegin = -10.0f;
public double m_fEnd = 10.0f;
public double m_fStep = 1.0f;
public ViewRange()
{
m_fBegin = -10.0f;
m_fEnd = 10.0f;
m_fStep = 1.0f;
}
public ViewRange(double b,double e,int n)
{
m_fBegin = b;
m_fEnd = e;
m_fStep = Math.abs(b-e)/n;
}
}
class CoordinateMapping
{
private final double m_PIE = Math.PI/180;
private double m_angleH = 0.0f;
private double m_angleV = 0.0f;
public CoordinateMapping()
{
}
void m_SetAngle(double H,double V)
{
m_angleH = H*m_PIE;
m_angleV = V*m_PIE;
}
Point m_GetWindowPoint(double scale,double X,double Y,double Z)
{ //根据缩放比例、坐标系旋转角度,将指定的空间坐标映射为屏幕窗口内的二维坐标(单位为像素)
double yz = Math.sqrt(Y*Y+Z*Z);
double XYZ = X*X+Y*Y+Z*Z;
double vPinkZy = Math.atan2(Y,Z);
double vBlueZy = vPinkZy + m_angleV;
double wGreen = Math.cos(vBlueZy)*yz;
double v = Math.sin(vBlueZy)*yz;
double h = Math.sin(Math.atan2(X,wGreen)+m_angleH) * Math.sqrt(Math.abs(XYZ-v*v));
int nH = (int)(h*scale);
int nV = (int)(v*scale)*(-1);
return new Point(nH,nV);
}
}
class CCoordinateAxis
{
private CoordinateMapping m_mappingTool = new CoordinateMapping();
private double m_fAngleH; //X轴沿Z轴旋转的角度
private double m_fAngleV; //X轴沿Y轴旋转的角度
private double m_fScale; //缩放比例,数学单位1对应的屏幕像素个数
private Point m_oWindowOrigin;
private Rectangle m_oWindowBound;
private Graphics m_oGraphics;
////////////////////////////////////////////////////////////////////////////////////////////////////
public void m_SetScale(double scale) { m_fScale = scale; }
public void m_SetAngleV(double angle)
{
m_fAngleV = angle;
m_mappingTool.m_SetAngle(m_fAngleH,m_fAngleV);
}
public void m_SetAngleH(double angle)
{
m_fAngleH = angle;
m_mappingTool.m_SetAngle(m_fAngleH,m_fAngleV);
}
public double m_GetScale() { return m_fScale; }
public double m_GetAngleV() { return m_fAngleV; }
public double m_GetAngleH() { return m_fAngleH; }
public void m_SetWindowOrigin(Point point) { m_oWindowOrigin = point; }
public Point m_GetWindowOrigin() { return m_oWindowOrigin; }
public void m_SetWindowBound(Rectangle rect) { m_oWindowBound = rect; }
public Rectangle m_GetWindowBound() { return m_oWindowBound; }
public CCoordinateAxis()
{
m_fAngleH = 0.0f; //Z轴沿X轴旋转的角度
m_fAngleV = 0.0f; //Z轴沿Y轴旋转的角度
m_fScale = 1.0f; //缩放比例,数学单位1对应的屏幕像素个数
m_oWindowOrigin = new Point(0,0);
m_oWindowBound = null;
m_oGraphics = null;
}
public void m_DrawCoordinate(Graphics graphics)
{
if( graphics != null ) m_oGraphics = graphics; else return;
double LO = -200/m_fScale;
double OL = 300/m_fScale;
Point AxisXO = m_mappingTool.m_GetWindowPoint(m_fScale,LO,0,0);
Point AxisOX = m_mappingTool.m_GetWindowPoint(m_fScale,OL,0,0);
Point AxisYO = m_mappingTool.m_GetWindowPoint(m_fScale,0,LO,0);
Point AxisOY = m_mappingTool.m_GetWindowPoint(m_fScale,0,OL,0);
Point AxisZO = m_mappingTool.m_GetWindowPoint(m_fScale,0,0,LO);
Point AxisOZ = m_mappingTool.m_GetWindowPoint(m_fScale,0,0,OL);
AxisXO.translate(m_oWindowOrigin.x,m_oWindowOrigin.y);
AxisOX.translate(m_oWindowOrigin.x,m_oWindowOrigin.y);
AxisYO.translate(m_oWindowOrigin.x,m_oWindowOrigin.y);
AxisOY.translate(m_oWindowOrigin.x,m_oWindowOrigin.y);
AxisZO.translate(m_oWindowOrigin.x,m_oWindowOrigin.y);
AxisOZ.translate(m_oWindowOrigin.x,m_oWindowOrigin.y);
//graphics.setSetBkColor(RGB(0,0,0));
graphics.setColor(new Color(255,255,255));
graphics.drawString("O",m_oWindowOrigin.x,m_oWindowOrigin.y);
Color colorX = new Color(255,0,0);
Color colorY = new Color(0,0,255);
Color colorZ = new Color(0,255,0);
BigDecimal dOL = new BigDecimal(OL);
BigDecimal dLO = new BigDecimal(LO);
String szUnit = "X="+
dOL.setScale(4,BigDecimal.ROUND_HALF_UP);
dLO.setScale(4,BigDecimal.ROUND_HALF_UP);
graphics.setColor(colorX); graphics.drawString("X="+dOL.toString(),AxisOX.x,AxisOX.y);
graphics.setColor(colorY); graphics.drawString("Y="+dOL.toString(),AxisOY.x,AxisOY.y);
graphics.setColor(colorZ); graphics.drawString("Z="+dOL.toString(),AxisOZ.x,AxisOZ.y);
graphics.setColor(colorX); graphics.drawLine(AxisXO.x,AxisXO.y,AxisOX.x,AxisOX.y);
graphics.setColor(colorY); graphics.drawLine(AxisYO.x,AxisYO.y,AxisOY.x,AxisOY.y);
graphics.setColor(colorZ); graphics.drawLine(AxisZO.x,AxisZO.y,AxisOZ.x,AxisOZ.y);
}
public Point m_GetWindowPoint(Point3D point3d)
{
Point point = m_mappingTool.m_GetWindowPoint(m_fScale,point3d.m_fX,point3d.m_fY,point3d.m_fZ);
//point.translate(m_oWindowOrigin.x,m_oWindowOrigin.y);
point.translate(m_oWindowOrigin.x,m_oWindowOrigin.y);
return point;
}
public Point m_GetWindowPoint(double X,double Y,double Z)
{
Point point = m_mappingTool.m_GetWindowPoint(m_fScale,X,Y,Z);
point.translate(m_oWindowOrigin.x,m_oWindowOrigin.y);
return point;
}
};
class CCurvePoints
{
private int m_nSymmetry = 0;
private int m_nSpace = 0;
private int m_nValid = 0;
private Point3D[] m_oPoints = null;
public CCurvePoints(int nSpace,int symmetry)
{
m_nSymmetry = symmetry;
m_nSpace = nSpace;
m_nValid = 0;
m_oPoints = new Point3D[nSpace];
}
public boolean m_Append(double x,double y,double z)
{
if( m_nValid >= m_nSpace ) return false; //空间不足
m_oPoints[m_nValid] = new Point3D();
m_oPoints[m_nValid].m_fX = x;
m_oPoints[m_nValid].m_fY = y;
m_oPoints[m_nValid].m_fZ = z;
m_nValid ++;
return true;
}
public Point3D m_GetAt(int nPoint)
{
if( nPoint > m_nValid ) return null; //nPoint超出有效范围
if( Double.isNaN(m_oPoints[nPoint].m_fX) ||
Double.isNaN(m_oPoints[nPoint].m_fY) ||
Double.isNaN(m_oPoints[nPoint].m_fZ) ) return null;
return m_oPoints[nPoint];
}
public int m_GetCount() { return m_nValid; }
public int m_GetSymmetry() { return m_nSymmetry; }
};
class CTracePoints
{
private int m_nSpace = 0;
private int m_nValid = 0;
private int[] m_nX = null;
private int[] m_nY = null;
private boolean m_Append(Point point)
{
if( m_nValid >= m_nSpace ) return false; //空间不足
m_nX[m_nValid] = point.x;
m_nY[m_nValid] = point.y;
m_nValid ++;
return true;
}
public CTracePoints(CCurvePoints curve,CCoordinateAxis axis)
{
int nPoint = curve.m_GetCount();
int nSymmetry = curve.m_GetSymmetry();
m_nValid = 0;
m_nSpace = 0;
switch(nSymmetry)
{
case Symmetry.SYMMETRY_ONE: m_nSpace = nPoint; break;
case Symmetry.SYMMETRY_X_2:
case Symmetry.SYMMETRY_Y_2:
case Symmetry.SYMMETRY_Z_2: m_nSpace = 2*nPoint+1; break;
default: return;
}
m_nX = new int[m_nSpace];
m_nY = new int[m_nSpace];
for( int n = 0; n < nPoint; n ++ )
{
Point3D point3d = curve.m_GetAt(n);
if( point3d == null ) m_Append(new Point(-1,-1));
else m_Append(axis.m_GetWindowPoint(point3d));
}
if(nSymmetry==Symmetry.SYMMETRY_ONE) return;
m_Append(new Point(-1,-1)); //在Y轴正负之间插入一个无效点,表示不连续
for( int n = 0; n < nPoint; n ++ )
{
Point3D point3d = curve.m_GetAt(n);
if( point3d != null )
{
double x = point3d.m_fX;
double y = point3d.m_fY;
double z = point3d.m_fZ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -