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 &lt; 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 &lt;= 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 &lt;= 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 &lt; 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 + -
显示快捷键?