- 最后登录
- 2025-4-15
- 在线时间
- 3893 小时
- 阅读权限
- 20
- 注册时间
- 2005-12-22
- 积分
- 9581
- 帖子
- 3769
- 精华
- 81
- UID
- 4618
- 性别
- 男
 
- 积分
- 9581
- 帖子
- 3769
- 精华
- 81
- UID
- 4618
- 性别
- 男
|
本帖最后由 hubo5563 于 2014-5-9 22:20 编辑
Fenz 发表于 2014-5-9 19:32 
其实我的也不会改变魔方的坐标,改变的是摄像机的坐标。然后再根据摄像机坐标来投影绘图。原理是一样的, ...
程序:
//////////////////////////////////////////////
//鼠标拖动事件处理
public void mouseDragged(MouseEvent e){
int x = e.getX();
int y = e.getY();
if (pushed)
return;
if (dragging) {
if(prevy>top && prevy<height+top)
{
if (painted) {
painted = false;
double xtheta = (y-prevy) * (360.0d / getSize().width); //计算按x轴转动的角度
double ytheta = (prevx-x) * (360.0d / getSize().height); //计算按y轴转动的角度
SpinX(xtheta); //变换矩阵
SpinY(ytheta); //变换矩阵
Graphics gg=getGraphics();
xianshimq(gg); //显示魔方
drawButtons(gg); //画底下的按钮
painted = true;
};
};
};
prevx = x;
prevy = y;
e.consume();
};
初始化矩阵
//将坐标变换矩阵设为单位矩阵
da11=1; da12=0; da13=0;
da21=0; da22=1; da23=0;
da31=0; da32=0; da33=1;
void SpinX(double jiao)
{
double a11,a12,a13,a21,a22,a23,a31,a32,a33;
double sina,cosa;
sina=Math.sin( jiao*Math.PI/180);
cosa=Math.cos( jiao*Math.PI/180);
a11=da11;
a21=cosa*da21+sina*da31;
a31=-sina*da21+cosa*da31;
a12=da12;
a22=cosa*da22+sina*da32;
a32=-sina*da22+cosa*da32;
a13=da13;
a23=cosa*da23+sina*da33;
a33=-sina*da23+cosa*da33;
//给全局变量赋值
da11=a11;da12=a12;da13=a13;
da21=a21;da22=a22;da23=a23;
da31=a31;da32=a32;da33=a33;
};
//以Y轴为轴魔方整体顺时针旋转一个角度
void SpinY(double jiao)
{
double a11,a12,a13,a21,a22,a23,a31,a32,a33;
double sina,cosa;
sina=Math.sin( jiao*Math.PI/180);
cosa=Math.cos( jiao*Math.PI/180);
a11=cosa*da11+sina*da31;
a21=da21;
a31=-sina*da11+cosa*da31;
a12=cosa*da12+sina*da32;
a22=da22;
a32=-sina*da12+cosa*da32;
a13=cosa*da13+sina*da33;
a23=da23;
a33=-sina*da13+cosa*da33;
//给全局变量赋值
da11=a11;da12=a12;da13=a13;
da21=a21;da22=a22;da23=a23;
da31=a31;da32=a32;da33=a33;
};
//以当前旋转矩阵变换三维点,整体旋转时采用
void dbh3(Point3d p,Point3d pp)
{
p.x=(pp.x)*da11+(pp.y)*da12+(pp.z)*da13;
p.y=(pp.x)*da21+(pp.y)*da22+(pp.z)*da23;
p.z=(pp.x)*da31+(pp.y)*da32+(pp.z)*da33;
};
//将三维坐标转换为2维透视坐标,转换x坐标
int dbh5x(Point3d p)
{
double xx,zz;int ii;
xx=p.x+xx1;
zz=p.z+zz1;
xx=xx*zz0/(zz0+zz);
xx=xx0+factor_x*xx;
ii=(int)xx;
return ii;
};
//将三维坐标转换为2维透视坐标,转换y坐标
int dbh5y(Point3d p)
{
double yy,zz;int ii;
yy=p.y+yy1;
zz=p.z+zz1;
yy=yy*zz0/(zz0+zz);
yy=yy0-factor_y*yy;
ii=(int)yy;
return ii;
};
经过变换就是屏幕的实际坐标。 |
|