国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【計(jì)算機(jī)圖形學(xué)】曲線和曲面

這篇具有很好參考價(jià)值的文章主要介紹了【計(jì)算機(jī)圖形學(xué)】曲線和曲面。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

模塊5 曲線和曲面

一 實(shí)驗(yàn)?zāi)康?/strong>

  1. 編寫曲線和曲面的算法

二 實(shí)驗(yàn)內(nèi)容

1:繪制Bezier曲線,并采用自行設(shè)計(jì)輸入和交互修改數(shù)據(jù)點(diǎn)的方式。

實(shí)驗(yàn)結(jié)果如下圖所示:

第一步:輸入特征多邊形的頂點(diǎn)個(gè)數(shù),并按照順序輸入頂點(diǎn)的坐標(biāo)。

【計(jì)算機(jī)圖形學(xué)】曲線和曲面
第二步:點(diǎn)擊左鍵生成bezier曲線(白色部分)和多邊形頂點(diǎn)(綠色部分)。

?【計(jì)算機(jī)圖形學(xué)】曲線和曲面


第三步:點(diǎn)擊右鍵修改頂點(diǎn),首先輸入需要修改的頂點(diǎn)在數(shù)組中的坐標(biāo)(即順序個(gè)數(shù)-1),此處以(100,100)為例,將其修改為(100,300)。

【計(jì)算機(jī)圖形學(xué)】曲線和曲面
第四步:通過敲擊回車鍵,可觀察修改后的bezier曲線和頂點(diǎn)。

?【計(jì)算機(jī)圖形學(xué)】曲線和曲面

第五步:如果需要繼續(xù)修改頂點(diǎn)坐標(biāo),用戶可以繼續(xù)點(diǎn)擊右鍵,重復(fù)上述操作。此處不再贅述。如果需要退出圖像繪制界面,用戶可以通過敲擊esc鍵,即可退出本實(shí)驗(yàn)界面。

2:繪制Bezier曲面,雙三次類型。


實(shí)驗(yàn)結(jié)果如下圖所示:

【計(jì)算機(jī)圖形學(xué)】曲線和曲面

2.1:繪制Bezier曲面,并采用自行設(shè)計(jì)輸入和交互修改數(shù)據(jù)點(diǎn)的方式,改進(jìn)。


實(shí)驗(yàn)結(jié)果如下圖所示:

【計(jì)算機(jī)圖形學(xué)】曲線和曲面
修改數(shù)據(jù)點(diǎn):

?【計(jì)算機(jī)圖形學(xué)】曲線和曲面

新貝塞爾曲面:

【計(jì)算機(jī)圖形學(xué)】曲線和曲面

三 程序說明

最終的實(shí)驗(yàn)代碼如下表所示:

1

//

// 程序名稱:Bezier曲線

// 功??? 能:繪制Bezier曲線,并采用自行設(shè)計(jì)輸入和交互修改數(shù)據(jù)點(diǎn)的方式。

// 編譯環(huán)境:VS2019,EasyX_20220116

// 最后修改:2022-4-28

#include <graphics.h>

#include <conio.h>

#include <iostream>

#include <math.h>

using namespace std;

//特征多邊形的特征

int n;

int px[100], py[100];

//初始化特征多邊形

void initialize() {

??? cout << "please input the number of your points (no more than 100)" << endl;

??? cin >> n;

??? cout << "please input each coordinate of your points in order" << endl;

??? for (int i = 0; i < n; i++) {

???????? cin >> px[i] >> py[i];

??? }

??? cout << "successfully set" << endl;

}文章來源地址http://www.zghlxwxcb.cn/news/detail-456478.html

//遞歸

int Factorial(int nn) {

??? if (nn == 0 || nn == 1) return 1;

??? else return nn * Factorial(nn - 1);

}

//繪制bezier曲線

void Bezier() {

??? int nn = n - 1;

??? //line(px[0], py[0], px[1], py[1]);

??? double i = 0, n1, n2;

??? n1 = Factorial(nn);

??? moveto(px[0], py[0]);

??? POINT point;

??? //在[0,1]內(nèi)循環(huán)

??? for (; i <= 1; i += 0.01) {

???????? point.x = 0;

???????? point.y = 0;

???????? for (int j = 0; j <= nn; j++) {

???????????? n2 = (n1 / (Factorial(j) * Factorial(nn - j))) * pow(i, j) * pow(1 - i, nn - j);

???????????? point.x += n2 * px[j];

???????????? point.y += n2 * py[j];

???????? }

???????? lineto(point.x, point.y);

??? }

??? lineto(px[n - 1], py[n - 1]);

??? //描繪用戶定義的點(diǎn)

??? for (int ii = 0; ii < n; ii++) {

???????? setfillcolor(GREEN);

???????? fillcircle(px[ii], py[ii], 3);

??? }

}

//主函數(shù)

int main() {

??? //初始化

??? initialize();

??? initgraph(640, 480);

??? ExMessage m;

??? //繪制圖像

??? while (1) {

???????? m = getmessage(EX_MOUSE | EX_KEY);

???????? switch (m.message) {

???????????? //右鍵修改坐標(biāo)信息

???????? ??? case WM_RBUTTONDOWN:

????????????????? closegraph();

????????????????? int arr, newx, newy;

????????????????? //輸入數(shù)組中的坐標(biāo),進(jìn)行修改

????????????????? cout << "which point do you want to change? please input its array number" << endl;

????????????????? while (1) {

????????????????????? cin >> arr;

????????????????????? if (arr >= n) {

????????????????????????? cout << "input error, try again" << endl;

????????????????????? }

????????????????????? else {

????????????????????????? break;

????????????????????? }

????????????????? }

????????????????? cout << "please input the reset coordinate" << endl;

????????????????? cin >> newx >> newy;

????????????????? px[arr] = newx;

????????????????? py[arr] = newy;

????????????????? cout << "successfully reset, please wait a second to see a new graph" << endl;

????????????????? initgraph(640, 480);

???????????? //左鍵繪制

???????????? case WM_LBUTTONDOWN:

????????????????? Bezier();

???????????? //退出圖形化界面

???????????? case WM_KEYDOWN:

????????????????? if (m.vkcode == VK_ESCAPE) {

????????????????????? return 0;

????????????????? }

???????? }

??? }

??? _getch();

??? closegraph();

??? return 0;

}

2

//

// 程序名稱:Bezier曲面

// 功??? 能:繪制Bezier曲面,雙三次類型。

// 編譯環(huán)境:VS2019,EasyX_20220116

// 最后修改:2022-5-9

#include <graphics.h>

#include <conio.h>

#include <iostream>

#include <cmath>

using namespace std;

#define pi 3.1415926

#define MAX 20

//三維點(diǎn)類

class Point3D {

public:

??? double x, y, z;

??? Point3D(int x = 0, int y = 0, int z = 0) {

???????? this->x = x;

???????? this->y = y;

???????? this->z = z;

??? };

??? void operator=(Point3D& a) {

???????? x = a.x;

???????? y = a.y;

???????? z = a.z;

??? };

??? Point3D operator*(double a) {

???????? return Point3D(a * x, a * y, a * z);

??? };

??? Point3D operator+(Point3D a) {

???????? return Point3D(x + a.x, y + a.y, z + a.z);

??? };

??? void operator+=(Point3D a) {

???????? x += a.x;

???????? y += a.y;

???????? z += a.z;

??? };

};

//求階乘

long int Factorial(int n) {

??? int i, sum = 1;

??? if (n == 0) {

???????? return 1;

??? }

??? for (i = 2; i <= n; i++) {

???????? sum *= i;

??? }

??? return sum;

}

//Bernstein函數(shù)

double Bernstein(int i, int n, double t) {

??? return (double)Factorial(n) / Factorial(i) / Factorial(n - i) * pow(t, i) * pow(1 - t, n - i);

}

//Bezier曲面求解

void BezierCurve(Point3D p[][MAX], int n, int m, int nd, int md, double sita, double fai) {

??? double hu = 1.0 / nd;

??? double hv = 1.0 / md;

??? double u = 0, v = 0;

??? int i, j, k, l;

??? sita = sita * pi / 180;

??? fai = fai * pi / 180;

??? int** pB = new int* [nd + 1];

??? for (i = 0; i <= nd; i++) {

???????? pB[i] = new int[2 * md + 2];

??? }

??? Point3D ptemp(0, 0, 0);

??? for (i = 0; i <= nd; i++, u += hu) {

???????? v = 0;

???????? for (j = 0; j <= 2 * md + 1; j += 2, v += hv) {

???????????? ptemp.x = 0;

???????????? ptemp.y = 0;

???????????? ptemp.z = 0;

???????????? for (k = 0; k <= n; k++) {

????????????????? for (l = 0; l <= m; l++) {

????????????????????? ptemp += p[k][l] * Bernstein(k, n, u) * Bernstein(l, m, v);

????????????????? }

???????????? }

???????????? pB[i][j] = ptemp.x * cos(sita) - ptemp.y * sin(sita) + 500;

???????????? pB[i][j + 1] = -ptemp.x * sin(sita) * sin(fai) - ptemp.y * cos(sita) * sin(fai) + ptemp.z * cos(fai) + 400;

???????? }

???????? drawpoly(md + 1, pB[i]);

??? }

??? for (i = 0; i < nd + 1; i++) {

???????? delete[]pB[i];

??? }

??? delete[]pB;

}

//畫控制多邊形

void drawControlPoly_3D(Point3D p[][MAX], int n, int m, double sita, double fai, int color) {

??? int** p2d = new int* [n + 1];

??? int i, j;

??? setcolor(color);

??? sita = sita * pi / 180;

??? fai = fai * pi / 180;

??? for (i = 0; i < n + 1; i++) {

???????? p2d[i] = new int[2 * m + 4];

??? }

??? char str[80];

??? //3D->2D

??? for (i = 0; i <= n; i++) {

???????? for (j = 0; j <= m; j++) {

???????????? p2d[i][2 * j] = p[i][j].x * cos(sita) - p[i][j].y * sin(sita) + 500;

???????????? p2d[i][2 * j + 1] = -p[i][j].x * sin(sita) * sin(fai) - p[i][j].y * cos(sita) * sin(fai) + p[i][j].z * cos(fai) + 400;

???????? }

???????? p2d[i][2 * j] = p2d[i][0];

???????? p2d[i][2 * j + 1] = p2d[i][1];

???????? drawpoly(m + 2, p2d[i]);

??? }

??? for (j = 0; j <= 2 * m + 1; j += 2) {

???????? moveto(p2d[0][j], p2d[0][j + 1]);

???????? for (i = 1; i <= n; i++) {

???????????? lineto(p2d[i][j], p2d[i][j + 1]);

???????? }

??? }

??? for (i = 0; i < n + 1; i++) {

???????? delete[]p2d[i];

??? }

??? delete[]p2d;

}

//雙幾次曲面

void BezierCurve_Shuang(Point3D p[][MAX], int pn, int pm, int nd, int md, double sita, double fai, int shuangjici) {

??? int i, j, k, l;

??? Point3D point[MAX][MAX];

??? for (i = 0; i < pn - shuangjici; i += shuangjici) {

???????? for (j = 0; j < pm - shuangjici; j += shuangjici) {

???????????? for (k = 0; k <= shuangjici; k++) {

????????????????? for (l = 0; l <= shuangjici; l++) {

????????????????????? point[k][l] = p[i + k][j + l];

????????????????? }

???????????? }

???????????? BezierCurve(point, shuangjici, shuangjici, nd, md, sita, fai);

???????? }

??? }

}

//主函數(shù)

int main() {

??? int n;

??? double fai, sita;

??? //固定角度了。

??? sita = 20;

??? fai = 160;

??? n = 3;

??? //頂點(diǎn)集合

??? Point3D p[][MAX] = {

???????? {Point3D(0,0,0),Point3D(150,150,150),Point3D(250,150,150),Point3D(400,0,0)},

??? ??? {Point3D(50,200,0),Point3D(150,250,150),Point3D(250,250,150),Point3D(450,200,0)},

??? ??? {Point3D(20,400,0),Point3D(150,350,150),Point3D(250,350,150),Point3D(420,400,0)},

??? ??? {Point3D(0,600,0),Point3D(150,550,150),Point3D(250,550,150),Point3D(400,600,0)}

??? };

??? /*

??? cout << "please input sita and fai" << endl;

??? cin >> sita >> fai;

??? cout << "please input your n" << endl;

??? cin >> n;

??? */

??? //初始化界面

??? initgraph(1000, 700);

??? setcolor(RED);

??? //Bezier曲面

??? BezierCurve_Shuang(p, 4, 4, 100, 100, sita, fai, n);

??? //畫控制多邊形

??? drawControlPoly_3D(p, 3, 3, sita, fai, GREEN);

??? _getch();

??? closegraph();

??? return 0;

}

2題改進(jìn)版本

//

// 程序名稱:Bezier曲面

// 功??? 能:繪制Bezier曲面,并采用自行設(shè)計(jì)輸入和交互修改數(shù)據(jù)點(diǎn)的方式。

// 編譯環(huán)境:VS2019,EasyX_20220116

// 最后修改:2022-5-13

#include <iostream>

#include <graphics.h>

#include <conio.h>

#include <math.h>

using namespace std;

#define PI 3.1415926

//定義 N * N 的控制點(diǎn)數(shù)組

const int N = 8;

float controlPoints[N][N][3] ={

??? { {-150, -150, 100}, {-100, -150, 0}, {-50, -150, 0}, {0, -150, 50}, {50, -150, 0}, {100, -150, 0}, {150, -150, -100}, {200, -150, 0} },

??? { {-150, -100, 0}, {-100, -100, 50}, {-50, -100, -100}, {0, -100, 0}, {50, -100, 0}, {100, -100, 100}, {150, -100, 0}, {200, -100, -50} },

??? { {-150, -50, 0}, {-100, -50, 0}, {-50, -50, 50}, {0, -50, 0}, {50, -50, 0}, {100, -50, 0}, {150, -50, -50}, {200, -50, 0} },

??? { {-150, 0, -50}, {-100, 0, -100}, {-50, 0, 0}, {0, 0, 150}, {50, 0, 0}, {100, 0, -100}, {150, 0, -50}, {200, 0, -50} },

??? { {-150, 50, 0}, {-100, 50, 0}, {-50, 50, -100}, {0, 50, 0}, {50, 50, 50}, {100, 50, 0}, {150, 50, 0}, {200, 50, 50} },

??? { {-150, 100, 50}, {-100, 100, 0}, {-50, 100, 0}, {0, 100, -50}, {50, 100, -50}, {100, 100, 50}, {150, 100, 0}, {200, 100, 0} },

??? { {-150, 150, 0}, {-100, 150, 100}, {-50, 150, -100}, {0, 150, 0}, {50, 150, 0}, {100, 150, 0}, {150, 150, -150}, {200, 150, 50} },

??? { {-150, 200, 0}, {-100, 200, 0}, {-50, 200, 50}, {0, 200, -50}, {50, 200, 0}, {100, 200, -100}, {150, 200, 0}, {200, 200, 50} }

};

//計(jì)算貝塞爾基函數(shù)的C值

int C(int n, int k) {

??? if (k > n) {

??????? return 0;

??? }

??? int c = 1;

??? for (int i = 0; i < k; i++) {

??????? c *= (n - i);

??????? c /= (i + 1);

??? }

??? return c;

}

//勾勒函數(shù)

void display(float x, float y, float z) {

??? putpixel(int(0.7071 * x - 0.7071 * y + 0.5f + 400), int(-0.4082 * x - 0.4082 * y + 0.8165 * z + 0.5f + 300), RED);

??? putpixel(int(0.7071 * x - 0.7071 * y + 0.5f + 400) + 1, int(-0.4082 * x - 0.4082 * y + 0.8165 * z + 0.5f + 300), RED);

??? putpixel(int(0.7071 * x - 0.7071 * y + 0.5f + 400) - 1, int(-0.4082 * x - 0.4082 * y + 0.8165 * z + 0.5f + 300), RED);

??? putpixel(int(0.7071 * x - 0.7071 * y + 0.5f + 400), int(-0.4082 * x - 0.4082 * y + 0.8165 * z + 0.5f + 300) + 1, RED);

??? putpixel(int(0.7071 * x - 0.7071 * y + 0.5f + 400), int(-0.4082 * x - 0.4082 * y + 0.8165 * z + 0.5f + 300) - 1, RED);

??? putpixel(int(0.7071 * x - 0.7071 * y + 0.5f + 400) + 1, int(-0.4082 * x - 0.4082 * y + 0.8165 * z + 0.5f + 300) + 1, RED);

??? putpixel(int(0.7071 * x - 0.7071 * y + 0.5f + 400) + 1, int(-0.4082 * x - 0.4082 * y + 0.8165 * z + 0.5f + 300) - 1, RED);

??? putpixel(int(0.7071 * x - 0.7071 * y + 0.5f + 400) - 1, int(-0.4082 * x - 0.4082 * y + 0.8165 * z + 0.5f + 300) + 1, RED);

??? putpixel(int(0.7071 * x - 0.7071 * y + 0.5f + 400) - 1, int(-0.4082 * x - 0.4082 * y + 0.8165 * z + 0.5f + 300) - 1, RED);

}

//Bezier曲面繪制

void Bezier() {

??? //繪制控制點(diǎn)

??? for (int i = 0; i < N - 1; i++) {

??????? for (int j = 0; j < N - 1; j++) {

??????????? fillcircle(int(0.7071 * controlPoints[i][j][0] - 0.7071 * controlPoints[i][j][1] + 0.5f + 400), int(-0.4082 * controlPoints[i][j][0] - 0.4082 * controlPoints[i][j][1] + 0.8165 * controlPoints[i][j][2] + 0.5f + 300), 3);

??????? }

??? }

??? // 繪制貝塞爾曲面

??? const int nPoints = 50;? // 每行/列計(jì)算的點(diǎn)數(shù)

??? float uStep = 1.0f / nPoints;

??? float vStep = 1.0f / nPoints;

??? for (float u = 0; u < 1; u += uStep) {

??????? for (float v = 0; v < 1; v += vStep) {

??????????? float x = 0, y = 0, z = 0;

??????????? for (int i = 0; i < N; i++) {

??????????????? for (int j = 0; j < N; j++) {

??????????????????? // 計(jì)算貝塞爾基函數(shù)的值

??????????????????? float basisU = powf(1 - u, N - 1 - i) * powf(u, i) * float(C(N - 1, i));

??????????????????? float basisV = powf(1 - v, N - 1 - j) * powf(v, j) * float(C(N - 1, j));

??????????????????? float basis = basisU * basisV;

??????????????????? // 使用貝塞爾基函數(shù)的值和控制點(diǎn)計(jì)算曲面上的點(diǎn)

??????????????????? x += basis * controlPoints[i][j][0];

??????????????????? y += basis * controlPoints[i][j][1];

??????????????????? z += basis * controlPoints[i][j][2];

??????????????? }

??????????? }

??????????? // 將曲面上的點(diǎn)連接起來

??????????? display(x, y, z);

??????? }

??? }

}

//主函數(shù)

int main(){

??? initgraph(800, 600);

??? Bezier();

??? ExMessage m;

??? while (1) {

??????? m = getmessage(EX_MOUSE | EX_KEY);

??????? switch (m.message) {

??????? case WM_RBUTTONDOWN:

??????????? //右鍵修改坐標(biāo)信息

??????????? closegraph();

??????????? int row, column, newx, newy, newz;

??????????? //輸入數(shù)組中的坐標(biāo),進(jìn)行修改

??????????? cout << "which point do you want to change? please input its row & column array number" << endl;

??????????? while (1) {

??????????????? cin >> row;

??????????????? cin >> column;

??????????????? if (row >= N) {

??????????????????? cout << "row number input error, try again" << endl;

??????????????? }

??????????????? else if (column >= N) {

??????????????????? cout << "column number input error, try again" << endl;

??????????????? }

??????????????? else {

??????????????????? break;

??????????????? }

??????????? }

??????????? cout << "please input the reset coordinate" << endl;

??????????? cin >> newx >> newy >> newz;

??????? ????controlPoints[row][column][0] = newx;

??????????? controlPoints[row][column][1] = newy;

??????????? controlPoints[row][column][2] = newz;

??????????? cout << "successfully reset, please wait a second to see a new graph" << endl;

??????????? initgraph(800, 600);

??????? case WM_LBUTTONDOWN:

??????????? //左鍵繪制

??????????? Bezier();

??????? case WM_KEYDOWN:

??????????? //退出圖形化界面

??????????? if (m.vkcode == VK_ESCAPE) {

??????????????? return 0;

??????????? }

??????? }

??? }

???

??? _getch();

??? closegraph();

??? return 0;

}

到了這里,關(guān)于【計(jì)算機(jī)圖形學(xué)】曲線和曲面的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 計(jì)算機(jī)圖形學(xué):三次Bezier曲線的繪制(算法原理及代碼實(shí)現(xiàn))

    計(jì)算機(jī)圖形學(xué):三次Bezier曲線的繪制(算法原理及代碼實(shí)現(xiàn))

    一、實(shí)現(xiàn)方案 ? ? ? ?貝塞爾曲線原理:貝塞爾曲線是計(jì)算機(jī)圖形圖像造型的基本工具,是圖形造型運(yùn)用得最多的基本線條之一。它通過控制曲線上的四個(gè)點(diǎn)(起始點(diǎn)、終止點(diǎn)以及兩個(gè)相互分離的中間點(diǎn))來創(chuàng)造、編輯圖形。其中起重要作用的是位于曲線中央的控制線。這條

    2024年02月11日
    瀏覽(25)
  • 計(jì)算機(jī)圖形學(xué) | 實(shí)驗(yàn)六:旋轉(zhuǎn)立方體

    計(jì)算機(jī)圖形學(xué) | 實(shí)驗(yàn)六:旋轉(zhuǎn)立方體

    華中科技大學(xué)《計(jì)算機(jī)圖形學(xué)》課程 MOOC地址:計(jì)算機(jī)圖形學(xué)(HUST) 在正式搭建環(huán)境之前,我們先來介紹一下讀完下面的部分你會(huì)了解些什么。 繪制出旋轉(zhuǎn)立方體需要的新知識(shí) 認(rèn)識(shí)一些 OpenGL的新功能 接下來,我們來介紹一下繪制旋轉(zhuǎn)立方體。繪制效果如下: Z-緩存(Z-Buff

    2024年02月06日
    瀏覽(86)
  • 計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)四 OpenGL的鼠標(biāo)交互繪制

    一、實(shí)驗(yàn)?zāi)康?1.掌握OpenGL的鼠標(biāo)按鈕響應(yīng)函數(shù)。 2.掌握OpenGL的鼠標(biāo)移動(dòng)響應(yīng)函數(shù)。 3.進(jìn)一步鞏固OpenGL的基本圖元繪制基礎(chǔ)。 二、實(shí)驗(yàn)內(nèi)容 1.鼠標(biāo)畫草圖——實(shí)現(xiàn)鼠標(biāo)點(diǎn)到哪,線就畫到哪。 思路: 1)在主程序注冊(cè)鼠標(biāo)響應(yīng)和鼠標(biāo)移動(dòng)子函數(shù): glutMouseFunc(mymouse); glutMotionFunc(mym

    2023年04月20日
    瀏覽(104)
  • 計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)——利用MFC對(duì)話框?qū)崿F(xiàn)多邊形繪制與填充(掃描線填充算法)附源碼

    計(jì)算機(jī)圖形學(xué)實(shí)驗(yàn)——利用MFC對(duì)話框?qū)崿F(xiàn)多邊形繪制與填充(掃描線填充算法)附源碼

    內(nèi)容概括: 利用基于對(duì)話框的MFC項(xiàng)目 實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊繪制多邊形 實(shí)現(xiàn)掃描線算法填充多邊形 源碼見Yushan-Ji/ComputerGraphics: ECNU2023秋 計(jì)算機(jī)圖形學(xué)課程實(shí)驗(yàn)代碼 (github.com) 通過鼠標(biāo)交互輸入多邊形 對(duì)各種多邊形進(jìn)行填充,包括邊界自交的情況 利用 OnLButtonDown 和 OnRButtonDown 函數(shù),

    2024年02月04日
    瀏覽(175)
  • 【計(jì)算機(jī)圖形學(xué)】二維圖形裁剪算法

    【計(jì)算機(jī)圖形學(xué)】二維圖形裁剪算法

    Cohen-Sutherland算法 Cohen-Sutherland是最早最流行的算法。 核心思想:通過 編碼測(cè)試 來減少計(jì)算交點(diǎn)的次數(shù)。(編碼算法) 1. 區(qū)域碼: 線段端點(diǎn)以區(qū)域賦值以四位二進(jìn)制碼。 編碼順序:四位從右到左分別為:左邊界、右邊界、下邊界、上邊界。 編碼值:落在相應(yīng)位置為1,否則

    2024年02月02日
    瀏覽(20)
  • 初識(shí)計(jì)算機(jī)圖形學(xué)

    初識(shí)計(jì)算機(jī)圖形學(xué)

    筆記來源:【老奇】陰差陽(yáng)錯(cuò) 撼動(dòng)世界的游戲引擎 詳見本人博客: 1.Transformation 2.梳理從MVP變換到光柵化的過程 MVP變換將空間中3D物體投影到2D屏幕 詳見本人博客: 1.Rasterization(光柵化) 2.梳理從MVP變換到光柵化的過程 場(chǎng)景是一個(gè)個(gè)由三角面組成的模型 將模型投射到像素就

    2024年01月21日
    瀏覽(22)
  • 計(jì)算機(jī)圖形與圖像技術(shù)

    計(jì)算機(jī)圖形與圖像技術(shù)

    可以使用Python、Java等語(yǔ)言。 下圖中,圖中各事物比例失調(diào) 如何使用代碼去掉某個(gè)人(不允許使用摳圖工具)? ????????像素(Pixel)是“圖像元素”的縮寫, 指的是圖像的最小單位 。 它是構(gòu)成數(shù)碼圖像或屏幕顯示圖像的基本單元,代表了圖像中的一個(gè)小點(diǎn)或一個(gè)小方塊

    2024年02月07日
    瀏覽(29)
  • 計(jì)算機(jī)圖形學(xué)——大作業(yè)

    計(jì)算機(jī)圖形學(xué)——大作業(yè)

    繪制一個(gè)簡(jiǎn)單的三維場(chǎng)景,可以是室內(nèi):臥室,辦公室,教室,也可以是室外:運(yùn)動(dòng)場(chǎng),公園等,加上光照效果,簡(jiǎn)單的紋理映射,透視投影;不能過于簡(jiǎn)單;可以加動(dòng)畫、鼠標(biāo)和鍵盤交互。 ??? 上交材料: project和word文檔(具體內(nèi)容展示,思路和心得) 首先初始化窗口,

    2024年02月11日
    瀏覽(19)
  • 【計(jì)算機(jī)圖形學(xué)01】坐標(biāo)變換

    【計(jì)算機(jī)圖形學(xué)01】坐標(biāo)變換

    ?????????將坐標(biāo)變換為標(biāo)準(zhǔn)化設(shè)備坐標(biāo),接著再轉(zhuǎn)化為屏幕坐標(biāo)的過程通常是分步進(jìn)行的,也就是類似于流水線那樣子。在流水線中,物體的頂點(diǎn)在最終轉(zhuǎn)化為屏幕坐標(biāo)之前還會(huì)被變換到多個(gè)坐標(biāo)系統(tǒng)(Coordinate System)。將物體的坐標(biāo)變換到幾個(gè) 過渡 坐標(biāo)系(Intermediate Coor

    2024年02月10日
    瀏覽(22)
  • 計(jì)算機(jī)圖形學(xué)(三) -- 3D 變換

    計(jì)算機(jī)圖形學(xué)(三) -- 3D 變換

    同樣引入齊次坐標(biāo): 3D 點(diǎn) = ( x , y , z , 1 ) T (x, y, z, 1)^T ( x , y , z , 1 ) T 3D 向量 = ( x , y , z , 0 ) T (x, y, z, 0)^T ( x , y , z , 0 ) T 通常, ( x , y , z , w ) (x, y, z, w) ( x , y , z , w ) (w != 0) 表示一個(gè)坐標(biāo)為 ( x / w , y / w , z / w ) (x/w, y/w, z/w) ( x / w , y / w , z / w ) 的 3D 點(diǎn) 用一個(gè) 4x4 的矩陣來表示

    2024年02月08日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包