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

用純C語言實(shí)現(xiàn)3D空間中的點(diǎn)坐標(biāo)轉(zhuǎn)化為屏幕二維點(diǎn)坐標(biāo),包含主視圖、側(cè)視圖、俯視圖、正等軸投影

這篇具有很好參考價(jià)值的文章主要介紹了用純C語言實(shí)現(xiàn)3D空間中的點(diǎn)坐標(biāo)轉(zhuǎn)化為屏幕二維點(diǎn)坐標(biāo),包含主視圖、側(cè)視圖、俯視圖、正等軸投影。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

要實(shí)現(xiàn)3D空間中的點(diǎn)坐標(biāo)轉(zhuǎn)換為屏幕二維點(diǎn)坐標(biāo),需要進(jìn)行透視變換和投影變換。以下是一些基本的思路和示例代碼,可以用于實(shí)現(xiàn)主視圖、側(cè)視圖、俯視圖、正等軸投影。

1. 主視圖投影

主視圖投影是指以一個(gè)點(diǎn)作為視點(diǎn),從一個(gè)方向觀察物體,投影到一個(gè)平面上。通常情況下,主視圖的觀察方向是從正面,也就是Z軸負(fù)方向。投影平面一般是平行于X-Y平面。

具體實(shí)現(xiàn)可以通過以下步驟完成:

  • 定義觀察點(diǎn)坐標(biāo)和投影平面距離
  • 對3D坐標(biāo)進(jìn)行透視變換
  • 對透視變換后的坐標(biāo)進(jìn)行投影變換
  • 將投影后的坐標(biāo)映射到屏幕上

示例代碼:

int x_2d = (int) (x_3d / (z_3d - view_point_z) * distance_to_projection_plane);
int y_2d = (int) (y_3d / (z_3d - view_point_z) * distance_to_projection_plane);

2. 側(cè)視圖投影

側(cè)視圖投影是指以一個(gè)點(diǎn)作為視點(diǎn),從一個(gè)方向觀察物體,投影到一個(gè)平面上。通常情況下,側(cè)視圖的觀察方向是從側(cè)面,也就是X軸正方向。投影平面一般是平行于Y-Z平面。

具體實(shí)現(xiàn)可以通過以下步驟完成:

  • 定義觀察點(diǎn)坐標(biāo)和投影平面距離
  • 對3D坐標(biāo)進(jìn)行透視變換
  • 對透視變換后的坐標(biāo)進(jìn)行投影變換
  • 將投影后的坐標(biāo)映射到屏幕上

示例代碼:

int x_2d = (int) (y_3d / (x_3d - view_point_x) * distance_to_projection_plane);
int y_2d = (int) (z_3d / (x_3d - view_point_x) * distance_to_projection_plane);

3.?俯視圖投影

俯視圖投影是指以一個(gè)點(diǎn)作為視點(diǎn),從一個(gè)方向觀察物體,投影到一個(gè)平面上。通常情況下,俯視圖的觀察方向是從上方,也就是Y軸正方向。投影平面一般是平行于X-Z平面。

具體實(shí)現(xiàn)可以通過以下步驟完成:

  • 定義觀察點(diǎn)坐標(biāo)和投影平面距離
  • 對3D坐標(biāo)進(jìn)行透視變換
  • 對透視變換后的坐標(biāo)進(jìn)行投影變換
  • 將投影后的坐標(biāo)映射到屏幕上

以下是一個(gè)簡單的示例代碼,用于將3D空間中的點(diǎn)坐標(biāo)轉(zhuǎn)化為屏幕二維點(diǎn)坐標(biāo)。這里包括了主視圖、側(cè)視圖、俯視圖、正等軸投影的實(shí)現(xiàn)。文章來源地址http://www.zghlxwxcb.cn/news/detail-757980.html

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480

typedef struct {
    double x, y, z;
} Point3D;

typedef struct {
    int x, y;
} Point2D;

void project_ortho(Point3D point_3d, Point2D *point_2d, double distance_to_projection_plane) {
    point_2d->x = (int) point_3d.x;
    point_2d->y = (int) point_3d.y;
}

void project_isometric(Point3D point_3d, Point2D *point_2d, double distance_to_projection_plane) {
    point_2d->x = (int) ((point_3d.x - point_3d.z) * cos(30 * M_PI / 180));
    point_2d->y = (int) ((point_3d.y - (point_3d.x + point_3d.z) * sin(30 * M_PI / 180)) * cos(30 * M_PI / 180));
}

void project_main(Point3D point_3d, Point2D *point_2d, Point3D view_point, double distance_to_projection_plane) {
    double z_3d = point_3d.z - view_point.z;
    point_2d->x = (int) (point_3d.x - view_point.x) * distance_to_projection_plane / z_3d + SCREEN_WIDTH / 2;
    point_2d->y = (int) (point_3d.y - view_point.y) * distance_to_projection_plane / z_3d + SCREEN_HEIGHT / 2;
}

void project_side(Point3D point_3d, Point2D *point_2d, Point3D view_point, double distance_to_projection_plane) {
    double x_3d = point_3d.x - view_point.x;
    point_2d->x = (int) (point_3d.y - view_point.y) * distance_to_projection_plane / x_3d + SCREEN_WIDTH / 2;
    point_2d->y = (int) (point_3d.z - view_point.z) * distance_to_projection_plane / x_3d + SCREEN_HEIGHT / 2;
}

void project_top(Point3D point_3d, Point2D *point_2d, Point3D view_point, double distance_to_projection_plane) {
    double y_3d = point_3d.y - view_point.y;
    point_2d->x = (int) (point_3d.x - view_point.x) * distance_to_projection_plane / y_3d + SCREEN_WIDTH / 2;
    point_2d->y = (int) (point_3d.z - view_point.z) * distance_to_projection_plane / y_3d + SCREEN_HEIGHT / 2;
}

int main() {
    // Define the 3D points of a cube
    Point3D cube[8] = {
        {-50, -50, -50},
        {50, -50, -50},
        {50, 50, -50},
        {-50, 50, -50},
        {50, -50, 50},
        {50, 50, 50},
        {-50, 50, 50},
        {-50, -50, 50},
    };

    // Define the view point for the main, side, and top projections
    Point3D main_view_point = {0, 0, 200};
    Point3D side_view_point = {-200, 0, 0};
    Point3D top_view_point = {0, 200, 0};

    // Define the distance from the projection plane for the orthogonal and isometric projections
    double distance_to_ortho_projection_plane = 200;
    double distance_to_isometric_projection_plane = 200 / cos(30 * M_PI / 180);

    // Project the 3D points to 2D points for each projection
    Point2D main_projection[8];
    Point2D side_projection[8];
    Point2D top_projection[8];
    Point2D ortho_projection[8];
    Point2D iso_projection[8];

    int i;
    for (i = 0; i < 8; i++) {
        project_main(cube[i], &main_projection[i], main_view_point, distance_to_ortho_projection_plane);
        project_side(cube[i], &side_projection[i], side_view_point, distance_to_ortho_projection_plane);
        project_top(cube[i], &top_projection[i], top_view_point, distance_to_ortho_projection_plane);
        project_ortho(cube[i], &ortho_projection[i], distance_to_ortho_projection_plane);
        project_isometric(cube[i], &iso_projection[i], distance_to_isometric_projection_plane);
    }

    // Draw the 2D projections
    // ...
    // Your code to draw the projections goes here
    // ...

    return 0;
}

到了這里,關(guān)于用純C語言實(shí)現(xiàn)3D空間中的點(diǎn)坐標(biāo)轉(zhuǎn)化為屏幕二維點(diǎn)坐標(biāo),包含主視圖、側(cè)視圖、俯視圖、正等軸投影的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 用純C語言分別實(shí)現(xiàn)增量式與位置式的PID自整定算法

    1、對于增量式PID自整定算法,C語言代碼如下: 2、位置式PID控制是一種常用的控制方法,可以實(shí)現(xiàn)給定值與實(shí)際值之間的閉環(huán)控制。下面是使用C語言編寫的一個(gè)位置式PID自整定算法的代碼,包含詳細(xì)的注釋: 這個(gè)代碼實(shí)現(xiàn)了一個(gè)位置式PID自整定算法,它包括了兩個(gè)函數(shù) pr

    2024年02月15日
    瀏覽(16)
  • Matlab 實(shí)現(xiàn)圖像的直角坐標(biāo)系和極坐標(biāo)系的相互轉(zhuǎn)化

    Matlab 實(shí)現(xiàn)圖像的直角坐標(biāo)系和極坐標(biāo)系的相互轉(zhuǎn)化

    某日需要在matlab進(jìn)行圖像的的極直互化,發(fā)現(xiàn)并沒有介紹相應(yīng)內(nèi)容的文章,所以有了自己調(diào)研一下并寫一寫的想法。果然只要想就能做到,所以有了下面這篇文章。 根據(jù)直角坐標(biāo)系(笛卡爾系)內(nèi)數(shù)值和極坐標(biāo)系關(guān)系 根據(jù)上述公式不難想出,在直角坐標(biāo)系中的圓會在極坐標(biāo)

    2024年02月11日
    瀏覽(21)
  • C# | DBSCAN聚類算法實(shí)現(xiàn) —— 對直角坐標(biāo)系中臨近點(diǎn)的點(diǎn)進(jìn)行聚類

    C# | DBSCAN聚類算法實(shí)現(xiàn) —— 對直角坐標(biāo)系中臨近點(diǎn)的點(diǎn)進(jìn)行聚類

    聚類算法是一種常見的數(shù)據(jù)分析技術(shù),用于將相似的數(shù)據(jù)對象歸類到同一組或簇中。其中,DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一種基于密度的聚類算法,能夠有效地識別出不同形狀和大小的簇,同時(shí)還能標(biāo)識出噪聲數(shù)據(jù)。本篇博客將介紹聚類算法的概念

    2024年02月09日
    瀏覽(36)
  • 消除 BEV 空間中的跨模態(tài)沖突,實(shí)現(xiàn) LiDAR 相機(jī) 3D 目標(biāo)檢測

    消除 BEV 空間中的跨模態(tài)沖突,實(shí)現(xiàn) LiDAR 相機(jī) 3D 目標(biāo)檢測

    Eliminating Cross-modal Conflicts in BEV Space for LiDAR-Camera 3D Object Detection 近期,3D目標(biāo)檢測器通常利用多傳感器數(shù)據(jù)和在共享的鳥瞰圖(BEV)表示空間中統(tǒng)一多模態(tài)特征。然而,我們的實(shí)證研究發(fā)現(xiàn),以前的方法在生成無跨模態(tài)沖突的融合BEV特征方面存在局限性。這些沖突包括由BEV特

    2024年04月15日
    瀏覽(25)
  • 向量空間中的基底和基變換以及坐標(biāo)變換

    向量空間中的基底和基變換以及坐標(biāo)變換

    基底的每一個(gè)成員稱作是基向量, n 維空間中的基底由 n 個(gè)基向量構(gòu)成,這些基向量需要滿足線性無關(guān)的條件,這樣的話n 維空間中的任何向量 v都能表示成n個(gè)基向量的線性組合且表示方式是唯一的。 參考鏈接 :https://zhuanlan.zhihu.com/p/247915130 基變換就是把一組基變到另一組基

    2024年02月16日
    瀏覽(21)
  • 使用echarts實(shí)現(xiàn)3D地圖和需要注意的點(diǎn)

    一種是map3D 一種是geo3D?+?series中的內(nèi)容(比如bar3D、scatter3D) 具體配置 Documentation - Apache ECharts https://echarts.apache.org/zh/option-gl.html#series-bar3D.coordinateSystem 中的 GL配置 中 需要強(qiáng)調(diào)的是: map3D可以使用?this.chart.on(\\\'click\\\',?回調(diào)函數(shù));方法獲取點(diǎn)擊內(nèi)容,而geo3D是不可以的。 所以我

    2024年02月01日
    瀏覽(21)
  • 【CSS3】CSS3 3D 轉(zhuǎn)換 ① ( CSS3 3D 轉(zhuǎn)換簡介 | 3D 物體與 2D 物體區(qū)別 | 3D 空間坐標(biāo)系 | 常用的 3D 轉(zhuǎn)換屬性 | 3D 位移轉(zhuǎn)換語法 | 代碼示例 )

    【CSS3】CSS3 3D 轉(zhuǎn)換 ① ( CSS3 3D 轉(zhuǎn)換簡介 | 3D 物體與 2D 物體區(qū)別 | 3D 空間坐標(biāo)系 | 常用的 3D 轉(zhuǎn)換屬性 | 3D 位移轉(zhuǎn)換語法 | 代碼示例 )

    3D 顯示的物體 與 平面 2D 顯示的物體有明顯的不同 , 3D 顯示效果有 近大遠(yuǎn)小 的 特點(diǎn) ; 元素的 2D 的 轉(zhuǎn)換效果 有 平移 , 旋轉(zhuǎn) , 縮放 效果 , 同樣有對應(yīng)的 3D 轉(zhuǎn)換效果 ; 2D 平面坐標(biāo)系 中 , 只有 x 軸 和 y 軸 ; 3D 空間坐標(biāo)系 比 2D 平面坐標(biāo)系 多了一個(gè) Z 軸 ; x 軸 : 水平向右 ; 左側(cè)是

    2024年02月12日
    瀏覽(32)
  • 使用Qt/C++實(shí)現(xiàn)WGS84、高德GCJ-02、百度BD-09坐標(biāo)系間相互轉(zhuǎn)化

    使用Qt/C++實(shí)現(xiàn)WGS84、高德GCJ-02、百度BD-09坐標(biāo)系間相互轉(zhuǎn)化

    ? ? ? ? 在做地圖相關(guān)開發(fā)時(shí)候,繞不開不同坐標(biāo)系間的轉(zhuǎn)化,因此我根據(jù)查閱相關(guān)資料后將不同坐標(biāo)系間的轉(zhuǎn)換封裝到一個(gè)GeoTranslate類中,該類轉(zhuǎn)換函數(shù)不僅支持Qt/C++調(diào)用,同時(shí)可在QML中直接調(diào)用,配合上QML/Map很方便,我將該類做了個(gè)Demo,方便使用者使用,效果如圖: 在

    2024年02月12日
    瀏覽(26)
  • 空間坐標(biāo)變換(Python&C++實(shí)現(xiàn))

    空間坐標(biāo)變換(Python&C++實(shí)現(xiàn))

    空間坐標(biāo)變換可看作坐標(biāo)點(diǎn)乘以一個(gè)齊次矩陣,其中,齊次矩陣可表示為: 其中: ①區(qū)域的3×3矩陣產(chǎn)生三維圖形的比例、對稱、旋轉(zhuǎn)、錯(cuò)切等基本變換; ②區(qū)域產(chǎn)生圖形的透視變換; ③區(qū)域產(chǎn)生沿X、Y、Z三個(gè)軸的平移變換; ④區(qū)域產(chǎn)生圖形的總比例變換。 平移變換可表示

    2024年02月13日
    瀏覽(18)
  • 將游戲坐標(biāo)轉(zhuǎn)化成屏幕鼠標(biāo)坐標(biāo)

    思路說明:轉(zhuǎn)化其實(shí)是取得兩點(diǎn)的相對位置,例如將游戲人物移動到另外一個(gè)位置(游戲人物初始位置坐標(biāo)到目的位置坐標(biāo)),鼠標(biāo)需要移動到屏幕的某個(gè)位置。算出游戲的移動距離,游戲兩個(gè)點(diǎn)之間的夾角(cos,sin),然后映射到屏幕中的兩個(gè)點(diǎn)。 注意:需要提前算出游戲兩

    2024年02月13日
    瀏覽(21)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包