OpenGL 中點關於直線、平面的對稱(反射)變換的實現,opengl中點
在數學中我們推導求點關於直線、平面對稱點的公式。這裡我將這些公式再次溫習一下,並用opengl的矩陣變換實現這些對稱變換。註:電腦圖形學中對稱變換也叫反射變換
1. 點關於直線對稱的對稱變換。
設二維空間中任一條直線l:y=mx+h,那麼點P(x0,y0)關於l的對稱點P'(x1,y1)的公式如下:
故變換矩陣為可看成先做縮放變換再做平移變換,然後再做整體縮放變換,矩陣如下:
同理三維空間中的直線也是如此。
2. 點關於平面對稱的點:
設三維空間中任一平面π:Ax+By+Cz+D = 0;那麼點P(x1,y1,z1)關於平面π對稱的對稱點P'(x1',y1',z1')的數學公式如下:
故矩陣變換如下:
OpenGL執行個體:點關於直線對稱
源碼:
</pre><pre name="code" class="cpp">#include <iostream>#include <gl/glut.h>using namespace std;// 初始化函數void mydisplay(){glClear(GL_DEPTH_BUFFER_BIT);glClearColor(0.0,0.0,0.0,0.0);// 畫點P(紅色)glColor3f(1.0,0,0);glPointSize(2.0);glBegin(GL_POINTS);glVertex2f(2.1,3.6);glEnd();// 畫線glColor3f(1.0,1.0,1.0);glBegin(GL_LINES);glVertex2f(1.2,1.2);glVertex2f(3.4,6);glEnd();// 點Pfloat data[3] = {2.1,3.6,1};// 點P1float data1[3];// 變換矩陣float A[3][3];float m = 2.18,h = -1.416;A[0][0] = 1-m*m;A[0][1] = 2*m;A[0][2] = 0;A[1][0] = 2*m;A[1][1] = m*m -1;A[1][2] = 0;A[2][0] = -2*m*h;A[2][1] = 2*h;A[2][2] = m*m+1;for(int i = 0;i < 3;i++){data1[i] = A[0][i]*data[0]+A[1][i]*data[1]+A[2][i]*data[2];}// 化為齊次座標data1[0] = data1[0]/data1[2];data1[1] = data1[1]/data1[2]; // 點P1(綠色)glColor3f(0.0,1.0,0.0);glBegin(GL_POINTS);glVertex2f(data1[0],data1[1]);glEnd();glFlush();}void reshape(int w,int h){glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,8.0,0.0,8.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}int main(int argc,char *argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(500,500);glutInitWindowPosition(0,0);glutCreateWindow("點關於直線對稱");glutDisplayFunc(mydisplay);glutReshapeFunc(reshape);glutMainLoop();}
高一必修二的直線對稱問題,怎運用到解題過程中?例如,折射光線,反射光線的應用題
你的追問:
好吧,我再說簡單一些,就是如何把直線的對稱問題運用到解決反射光線(直線方程),折射光線(直線方程)中,例如:一束平行光線從原點O(0,0)出發,經過直線L:8X+6Y=25反射後,通過點P(—4,3),求反射光線所在直線方程。我想要的是這一類應用題的解決方案,有沒有快速的,明白了嗎?
這個題目很好解
1、將P點關於直線L:8X+6Y=25的對稱點P'計算出來
2、寫出直線方程OP'
3、與L聯立解出交點E,即為入射點。
4、寫出直線PE的方程就是反射線所在的直線方程。
對於直線y=3x的反射變換對應的矩陣A 各位為我解答,本人較愚鈍,過程詳細一點,好的加分,,
在平面上任取一點P(x,y),點P關於y=3x的對稱點P(x′,y′)