c語言透視投影,投影與透視

本文目錄一覽:

求C語言編的程序 急用

/*顯示一個立方體*/

#include dos.h

#include math.h

#include conio.h

#include stdio.h

#include stdlib.h

#include graphics.h

#define PI 3.1415926

/*定義按鍵*/

#define ESC 0x11b

/*以下4個鍵,依次是上 下 左 右*/

#define X_axis_clkwise 0x4800

#define X_axis_Cntclkwise 0x5000

#define Y_axis_clkwise 0x4b00

#define Y_axis_Cntclkwise 0x4d00

/*以下2個鍵,依次是A, D*/

#define Z_axis_clkwise 0x1e61

#define Z_axis_Cntclkwise 0x2064

#define Distance_forward 0x1177

#define Distance_Backward 0x1f73

/*以下6個鍵,依次是U, J, I, K, O, L*/

#define X_Delta_Plus 0x1675

#define X_Delta_Minus 0x246a

#define Y_Delta_Plus 0x1769

#define Y_Delta_Minus 0x256b

#define Z_Delta_Plus 0x186f

#define Z_Delta_Minus 0x266c

/*繞X軸旋轉矩陣*/

float X_Rotate_Matrix[4][4] = { 1, 0, 0, 0,

0, 1, 0, 0,

0, 0, 1, 0,

0, 0, 0, 1 };

/*繞Y軸旋轉矩陣*/

float Y_Rotate_Matrix[4][4] = { 1, 0, 0, 0,

0, 1, 0, 0,

0, 0, 1, 0,

0, 0, 0, 1 };

/*繞Z軸旋轉矩陣*/

float Z_Rotate_Matrix[4][4] = { 1, 0, 0, 0,

0, 1, 0, 0,

0, 0, 1, 0,

0, 0, 0, 1 };

/*平移矩陣*/

float Transist_Matrix[4][4] = { 1, 0, 0, 0,

0, 1, 0, 0,

0, 0, 1, 0,

0, 0, 0, 1 };

/*透視投影變換矩陣*/

float Perspective_Projection[4][4] = { 1, 0, 0, 0,

0, 1, 0, 0,

0, 0, 0, 0,

0, 0, 0, 1 };

int num;

float *Matrix_Mul(float *pMatrix1, int Num_Row_Matrix1, int Num_Column_Matrix1,

float *pMatrix2, int Num_Row_Matrix2, int Num_Column_Matrix2 ) {

/*實現兩個矩陣:

輸入參數: *pMatrix1: 指向第一個矩陣

Num_Row_Matrix1: 第一個矩陣的行數

Num_Column_Matrix1: 第一個矩陣的列數

餘下三個參數類推;

return 指向運算結果的float類型指針.*/

int i, j, m, n;

float *pNewMatrix1, *pNewMatrix2, Sum;

if( Num_Column_Matrix1 != Num_Row_Matrix2) {

printf(“Invalid Matrixs!\n”);

return 0;

}

pNewMatrix1 = malloc(Num_Row_Matrix1 * Num_Column_Matrix2 * 4);

/*申請內存空間, Size(/bytes) = 第一個矩陣的行數 * 第二個矩陣的列數 * 4(= sizeof(float))*/

pNewMatrix2 = pNewMatrix1;

/*具體算法詳見如下代碼*/

for( i = 0; i Num_Row_Matrix1; i++) {

for( n = 0; n Num_Column_Matrix2; n++) {

Sum = 0;

for( j = 0; j Num_Column_Matrix1; j++)

Sum += (*(pMatrix1+i*Num_Column_Matrix1+j)) * (*(pMatrix2+j*Num_Column_Matrix2+n));

*(pNewMatrix1++) = Sum;

}

}

return pNewMatrix2;

}

/*轉換成齊次坐標矩陣*/

void Matrix_Convertion(float *pMatrix, int Num_Row) {

int i, j;

for(i = 0; i Num_Row; i++) {

if((*(pMatrix+i*4+3)) != 0) {

*(pMatrix+i*4) = (*(pMatrix+i*4)) / (*(pMatrix+i*4+3));

*(pMatrix+i*4+1) = (*(pMatrix+i*4+1)) / (*(pMatrix+i*4+3));

*(pMatrix+i*4+2) = (*(pMatrix+i*4+2)) / (*(pMatrix+i*4+3));

}

}

}

/*取得投影坐標*/

float *Get_X_Y(float *pMatrix, int Num_Row) {

int i, j, Num;

float *pNewMatrix;

Num = 0;

for(i = 0; i Num_Row; i++) {

if((*(pMatrix+i*4+3)) != 0)

Num++;

}

pNewMatrix = malloc(Num * 2 * 4);

/*存放格式,{(x1, y1),(x2, y2), … ,(xn, yn)}*/

for(i = 0; i Num; i++) {

if((*(pMatrix+i*4+3)) != 0) {

*(pNewMatrix+i*2) = (*(pMatrix+i*4))+300; /*顯示在屏幕中心, x = 300*/

*(pNewMatrix+i*2+1) = (*(pMatrix+i*4+1))+200; /*顯示在屏幕中心, y = 200*/

}

}

return pNewMatrix;

}

/*設置旋轉矩陣, Rotate around aixs labled with X or Y or Z*/

void SetMatrix_X(float X_Angle) {

float CosX, SinX;

SinX = sin(X_Angle * PI /128);

CosX = cos(X_Angle * PI /128);

X_Rotate_Matrix[1][1] = CosX;

X_Rotate_Matrix[1][2] = SinX;

X_Rotate_Matrix[2][1] = -1 * SinX;

X_Rotate_Matrix[2][2] = CosX;

}

void SetMatrix_Y(float Y_Angle) {

float CosY, SinY;

SinY = sin(Y_Angle * PI /128);

CosY = cos(Y_Angle * PI /128);

Y_Rotate_Matrix[0][0] = CosY;

Y_Rotate_Matrix[0][2] = -1 * SinY;

Y_Rotate_Matrix[2][0] = SinY;

Y_Rotate_Matrix[2][2] = CosY;

}

void SetMatrix_Z(float Z_Angle) {

float CosZ, SinZ;

SinZ = sin(Z_Angle * PI /128);

CosZ = cos(Z_Angle * PI /128);

Z_Rotate_Matrix[0][0] = CosZ;

Z_Rotate_Matrix[0][1] = SinZ;

Z_Rotate_Matrix[1][0] = -1 * SinZ;

Z_Rotate_Matrix[1][1] = CosZ;

}

/*類同*/

void Set_Transist_Matrix(float X, float Y,float Z) {

Transist_Matrix[3][0] = X;

Transist_Matrix[3][1] = Y;

Transist_Matrix[3][2] = Z;

}

/*類同*/

void Set_Perspective_Projection(float k) {

Perspective_Projection[2][3] = -1/k;

}

/*初始化圖形驅動*/

void InitGraph(void) {

int gd=DETECT,gm;

initgraph(gd,gm,”E:\\TC”);

}

/*生成立方體*/

float *Cube(void) {

int i, j, k;

float *pPoints1, *pPoints2;

num = 0;

for( i = -50; i = 50; i += 20)

for( j = -50; j = 50; j += 20)

for( k = -50; k = 50; k += 20)

num++;

pPoints1 = malloc( num * 4 * 4 );

pPoints2 = pPoints1;

for( i = -50; i = 50; i += 20)

for( j = -50; j = 50; j += 20)

for( k = -50; k = 50; k += 20) {

*(pPoints1++) = i;

*(pPoints1++) = j;

*(pPoints1++) = k;

*(pPoints1++) = 1;

}

return pPoints2;

}

/*Functions used for drawing Clearing*/

void Plot_NewPoints(float *pPoints) {

int i;

for(i=0;inum;i++)

putpixel( (int) (*(pPoints+i*2)), (int) (*(pPoints+i*2+1)), 7);

}

void Clear_OldPoints(float *pPoints) {

int i;

for(i=0;inum;i++)

putpixel( (int) (*(pPoints+i*2)), (int) (*(pPoints+i*2+1)), 0);

}

/*Function used for controlling*/

void Operate(int Switch, float *Ang_Rot_X, float *Ang_Rot_Y, float *Ang_Rot_Z,

float *X_Delta, float *Y_Delta, float *Z_Delta,float *Distance) {

switch(Switch) {

case X_axis_clkwise: (*Ang_Rot_X)–; break;

case X_axis_Cntclkwise: (*Ang_Rot_X)++; break;

case Y_axis_clkwise: (*Ang_Rot_Y)–; break;

case Y_axis_Cntclkwise: (*Ang_Rot_Y)++; break;

case Z_axis_clkwise: (*Ang_Rot_Z)–; break;

case Z_axis_Cntclkwise: (*Ang_Rot_Z)++; break;

case X_Delta_Plus: (*X_Delta)–; break;

case X_Delta_Minus: (*X_Delta)++; break;

case Y_Delta_Plus: (*Y_Delta)–; break;

case Y_Delta_Minus: (*Y_Delta)++; break;

case Z_Delta_Plus: (*Z_Delta)++; break;

case Z_Delta_Minus: (*Z_Delta)–; break;

case Distance_forward: (*Distance)++; break;

case Distance_Backward: (*Distance)–; break;

default: (*Ang_Rot_Y)++; break;

}

}

int main() {

int i, j, Key;

float *pMatrix1, *pMatrix2;

float *pBasePoints;

float *pPerspectivePoints;

float Ang_Rot_Xaxis, Ang_Rot_Yaxis, Ang_Rot_Zaxis;

float X_Delta, Y_Delta, Z_Delta;

float Distance;

clrscr();

InitGraph();

/*Varieties initialized*/

pBasePoints = Cube();

Ang_Rot_Xaxis = 0;

Ang_Rot_Yaxis = 0;

Ang_Rot_Zaxis = 0;

X_Delta = 0;

Y_Delta = 0;

Z_Delta = 0;

Distance = 200;

Key = 0;

while(Key != ESC) {

if( bioskey(1) )

Key = bioskey(0);

Operate(Key, Ang_Rot_Xaxis, Ang_Rot_Yaxis, Ang_Rot_Zaxis,

X_Delta, Y_Delta, Z_Delta, Distance);

SetMatrix_X(Ang_Rot_Xaxis);

SetMatrix_Y(Ang_Rot_Yaxis);

SetMatrix_Z(Ang_Rot_Zaxis);

Set_Transist_Matrix(X_Delta, Y_Delta, Z_Delta);

Set_Perspective_Projection(Distance);

/*The following may be known by you

pay your attention specially to the pair of malloc free */

pMatrix1 = Matrix_Mul( (float*)X_Rotate_Matrix, 4, 4, (float*)Y_Rotate_Matrix, 4, 4);

pMatrix2 = Matrix_Mul( pMatrix1, 4, 4, (float*)Z_Rotate_Matrix, 4, 4);

free(pMatrix1);

pMatrix1 = Matrix_Mul( pMatrix2, 4, 4, (float*)Transist_Matrix, 4, 4);

free(pMatrix2);

pMatrix2 = Matrix_Mul( pMatrix1, 4, 4, (float*)Perspective_Projection, 4, 4);

free(pMatrix1);

pMatrix1 = Matrix_Mul( pBasePoints, num, 4, pMatrix2, 4, 4);

free(pMatrix2);

Matrix_Convertion( pMatrix1, num);

pPerspectivePoints = Get_X_Y(pMatrix1, num);

Plot_NewPoints(pPerspectivePoints);

delay(5000);

Clear_OldPoints(pPerspectivePoints);

free(pPerspectivePoints);

free(pMatrix1);

}

free(pBasePoints);

closegraph();

return 0;

}

c語言編的兩點透視投影:我覺得函數調用部分,數組名與指針之間傳遞有問題,很急的。。。

修改一:

修改一下zhuanhuan函數,如下

void zhuanhuan(float (*a)[9], float bian[4][4],float Matrix[4][9]){ //改成3個參數不需要反回值,順便給形參加上反回類型吧。

//float matri[4][9]; //這一行可以不要了

for(int i=0;i4;i++){ //xinjuzhenhangshu

for(int j=0;j9;j++){ //xinjuzhenlieshu

for(int k;k4;k++){

a[i][j]=bian[i][k]*Matrix[k][j]; //把matri改為形參a就可以了

} //jisuanzhongxiaoshidehanglieshu4

}

}

}

修改二:

main函數裡面以下3句

====》matri=zhuanhuan(bian,Matrix);//xuanzhuan45du

====》matri2=zhuanhuan(pingyi,matri);//pingyichengbiaozhuntouyinggeshi

–==》matri3=zhuanhuan(M,matri2);//touying

分別修改為

zhuanhuan(matri,bian,Matrix);

matri2=zhuanhuan(matri2,pingyi,matri);

matri3=zhuanhuan(matri3, M,matri2);

原理:

函數的形參若是指針,則改變指針所指向地址的值就會改變實參的值,因此在調用matri3=zhuanhuan(matri3,M,matri2);時實參的地址matri3傳遞到形參int (*a)[9]時,形參a指向的地址的值就是實參matri3的值,因此改變形參的值就會改變實參matri3的值,因此只需直接調用函數即可,不須反回值。

註:你的程序究竟是幹什麼的還不知道,因為這還不是完整程序,程序中的line函數不知道是怎樣的,還有什麼VGA,VGAHI是什麼也不知道,因此,只能把程序修改成這樣,至於能不能達到要求那就不清楚了。 程序中的其他錯誤沒法驗證,但基本思想是這樣的。

C語言做投影問題

簡單的說,就是這樣的,比如一個點的坐標是(x,y,z),變成(x,y)就是一種投影。你把z值去掉後算出面積,就是投影面積。然後算出原來多邊形平面和xoy平面的夾角theta,投影面積除以cos(theta)就是結果。

原創文章,作者:BDWNL,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/313376.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
BDWNL的頭像BDWNL
上一篇 2025-01-07 09:43
下一篇 2025-01-07 09:43

相關推薦

  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28
  • Python作為中心語言,在編程中取代C語言的優勢和挑戰

    Python一直以其簡單易懂的語法和高效的編碼環境而著名。然而,它最近的發展趨勢表明Python的使用範圍已經從腳本語言擴展到了從Web應用到機器學習等廣泛的開發領域。與此同時,C…

    編程 2025-04-28
  • Python基礎語言

    Python作為一種高級編程語言擁有簡潔優雅的語法。在本文中,我們將從多個方面探究Python基礎語言的特點以及使用技巧。 一、數據類型 Python基礎數據類型包括整數、浮點數、…

    編程 2025-04-28

發表回復

登錄後才能評論