vetexofothers.htm
来自「电脑图学(Computer Graphics)是资料结构、演算法与数学的应用」· HTM 代码 · 共 141 行
HTM
141 行
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="css/stdlayout.css" type="text/css">
<link rel="stylesheet" href="css/print.css" type="text/css">
<meta content="text/html; charset=gb2312" http-equiv="content-type">
<title>旋转体、锥状体、柱状体顶点</title>
</head>
<body>
<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>
<h1><a href="ComputerGraphics.htm">Computer Graphics: 旋转体、锥状体、柱状体顶点<br>
</a></h1>
由于旋转体、锥状体、柱状体的几何性质,使得它们的顶点配置具有规则而容易以运算来进行配置,观念上十分简单。<br>
<h2>旋转体</h2>
假设旋转体是绕着Y轴旋转,则可以先定义出一条錂线上的顶点,与它们各自距Y轴的距离,接下来只要旋转这些顶点,就可以得出旋转体所有的顶点,如下所示:<br>
<img style="width: 451px; height: 258px;" alt="" src="images/vetexOfOthers-1.jpg"><br>
<br>
真实世界中的旋转体很多,所以这个方法可以画出各种不同的旋转体;下面这个程式画出一个高脚杯,它不储存顶点,而直接利用运算后的顶点来绘制酒杯的骨架,采取的方法是先用回圈画圈圈,再由一次回圈来画錂线: <br>
<ul>
<li> VetexDemo.java</li>
</ul>
<pre>package onlyfun.caterpillar;<br> <br>import java.awt.Color;<br>import java.awt.Graphics;<br>import javax.swing.JApplet;<br> <br>public class VetexDemo extends JApplet {<br> private int orgX;<br> private int orgY;<br> <br> public void init() {<br> super.init();<br> setBackground(Color.black);<br> orgX = (int)getSize().width / 3;<br> orgY = (int) (getSize().height - 80);<br> }<br> <br> public void paint(Graphics g) {<br> g.setColor(Color.yellow); <br> <br> double[] yLocations = <br> {180, 140, 100, 60, 20, 10, 4, 0};<br> double[] rDistances = <br> {100, 55, 10, 10, 10, 50, 80, 80};<br> <br> // 从斜角绘制<br> // 绕 x 轴转 30 度,绕 z 轴转 -25 度<br> double angleX = Math.toRadians(30);<br> double angleZ = Math.toRadians(-25);<br> <br> // 360 度画圈<br> for(int i = 0; i < yLocations.length; i++) { <br> // 我们要画线段,所以求出第一点不用画<br> double x = rDistances[i] * Math.cos(0);<br> double z = rDistances[i] * Math.sin(0);<br> <br> int lineStartX = (int) (orgX + <br> xAfterRotateAroundXZ(x, yLocations[i],<br> z, angleX, angleZ));<br> int lineStartY = (int) (orgY - <br> yAfterRotateAroundXZ(x, yLocations[i],<br> z, angleX, angleZ));<br> <br> for(int j = 1; j <= 360; j += 10) {<br> // 计算 x, z 座标<br> x = rDistances[i] <br> * Math.cos(Math.toRadians(j)); <br> z = rDistances[i] <br> * Math.sin(Math.toRadians(j));<br> <br> // 立体旋转,从斜角绘制,调整绘图中心至视窗中心<br> int lineEndX = (int) (orgX + <br> xAfterRotateAroundXZ(x, yLocations[i],<br> z, angleX, angleZ));<br> int lineEndY = (int) (orgY - <br> yAfterRotateAroundXZ(x, yLocations[i],<br> z, angleX, angleZ));<br> <br> g.drawLine(lineStartX, lineStartY, <br> lineEndX, lineEndY); <br> lineStartX = lineEndX; <br> lineStartY = lineEndY;<br> } <br> } <br> <br> // 画錂线 <br> for(int j = 0; j <= 360; j+=60) {<br> // 我们要画线段,所以求出第一点不用画<br> double x = rDistances[0] * <br> Math.cos(Math.toRadians(j)); <br> double z = rDistances[0] * <br> Math.sin(Math.toRadians(j));<br> <br> int lineStartX = (int) (orgX + <br> xAfterRotateAroundXZ(x, yLocations[0],<br> z, angleX, angleZ));<br> int lineStartY = (int) (orgY - <br> yAfterRotateAroundXZ(x, yLocations[0],<br> z, angleX, angleZ));<br> <br> for(int i = 1; i < yLocations.length; i++) { <br> x = rDistances[i] * <br> Math.cos(Math.toRadians(j)); <br> z = rDistances[i] * <br> Math.sin(Math.toRadians(j));<br> <br> // 立体旋转,从斜角绘制,调整绘图中心至视窗中心<br> int lineEndX = (int) (orgX + <br> xAfterRotateAroundXZ(x, yLocations[i],<br> z, angleX, angleZ));<br> int lineEndY = (int) (orgY - <br> yAfterRotateAroundXZ(x, yLocations[i],<br> z, angleX, angleZ));<br><br> g.drawLine(lineStartX, lineStartY, <br> lineEndX, lineEndY); <br> lineStartX = lineEndX; <br> lineStartY = lineEndY;<br> } <br> }<br> }<br> <br> private double xAfterRotateAroundXZ(double x, double y, <br> double z, double angleX, double angleZ) {<br> return (x*Math.cos(angleZ) - <br> (y*Math.cos(angleX) - z*Math.sin(angleX)) <br> * Math.sin(angleZ)); <br> }<br> <br> private double yAfterRotateAroundXZ(double x, double y, <br> double z, double angleX, double angleZ) {<br> return (x*Math.sin(angleZ) + <br> (y*Math.cos(angleX) - z*Math.sin(angleX)) <br> * Math.cos(angleZ)); <br> }<br>}</pre>
<br>
上面这个Applet的绘图结果如下:<br>
<img style="width: 258px; height: 369px;" alt="" src="images/vetexOfOthers-2.jpg"><br>
<span style="font-weight: bold;"><br>
</span>
<h2> 锥状体</h2>
锥状体将底面所有的顶点放置在XZ平面上,底面与锥顶点的交点为(xc, 0, yc),高度为h,则锥顶点的座标为(xc, h,
yc),如下所示: <br>
<img style="width: 330px; height: 175px;" alt="" src="images/vetexOfOthers-3.jpg"><br>
<h2> 柱状体</h2>
柱状体将底面所有的顶点放置在XZ平面上,高度为h,则顶点座标配置如下所示:<br>
<img style="width: 351px; height: 223px;" alt="" src="images/vetexOfOthers-4.jpg"><br>
<br>
<br>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?