⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 coordinatesys.java

📁 使用JAVA实现的三维图形处理.可根据输入的曲线方程,如x^2+y^2+z^2=1表示为(1-(Y/50)^2+(Z/60)^2)^(1/2)*100),绘制三维曲线.并可通过拖动鼠标让曲线在三维空间
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
 * 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 + -