用纯C语言实现3D空间中的点坐标转化为屏幕二维点坐标,包含主视图、侧视图、俯视图、正等轴投影

这篇具有很好参考价值的文章主要介绍了用纯C语言实现3D空间中的点坐标转化为屏幕二维点坐标,包含主视图、侧视图、俯视图、正等轴投影。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

要实现3D空间中的点坐标转换为屏幕二维点坐标,需要进行透视变换和投影变换。以下是一些基本的思路和示例代码,可以用于实现主视图、侧视图、俯视图、正等轴投影。

1. 主视图投影

主视图投影是指以一个点作为视点,从一个方向观察物体,投影到一个平面上。通常情况下,主视图的观察方向是从正面,也就是Z轴负方向。投影平面一般是平行于X-Y平面。

具体实现可以通过以下步骤完成:

  • 定义观察点坐标和投影平面距离
  • 对3D坐标进行透视变换
  • 对透视变换后的坐标进行投影变换
  • 将投影后的坐标映射到屏幕上

示例代码:

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. 侧视图投影

侧视图投影是指以一个点作为视点,从一个方向观察物体,投影到一个平面上。通常情况下,侧视图的观察方向是从侧面,也就是X轴正方向。投影平面一般是平行于Y-Z平面。

具体实现可以通过以下步骤完成:

  • 定义观察点坐标和投影平面距离
  • 对3D坐标进行透视变换
  • 对透视变换后的坐标进行投影变换
  • 将投影后的坐标映射到屏幕上

示例代码:

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. 俯视图投影

俯视图投影是指以一个点作为视点,从一个方向观察物体,投影到一个平面上。通常情况下,俯视图的观察方向是从上方,也就是Y轴正方向。投影平面一般是平行于X-Z平面。

具体实现可以通过以下步骤完成:

  • 定义观察点坐标和投影平面距离
  • 对3D坐标进行透视变换
  • 对透视变换后的坐标进行投影变换
  • 将投影后的坐标映射到屏幕上

以下是一个简单的示例代码,用于将3D空间中的点坐标转化为屏幕二维点坐标。这里包括了主视图、侧视图、俯视图、正等轴投影的实现。文章来源地址https://www.toymoban.com/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;
}

到了这里,关于用纯C语言实现3D空间中的点坐标转化为屏幕二维点坐标,包含主视图、侧视图、俯视图、正等轴投影的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用纯C语言分别实现增量式与位置式的PID自整定算法

    1、对于增量式PID自整定算法,C语言代码如下: 2、位置式PID控制是一种常用的控制方法,可以实现给定值与实际值之间的闭环控制。下面是使用C语言编写的一个位置式PID自整定算法的代码,包含详细的注释: 这个代码实现了一个位置式PID自整定算法,它包括了两个函数 pr

    2024年02月15日
    浏览(35)
  • Matlab 实现图像的直角坐标系和极坐标系的相互转化

    某日需要在matlab进行图像的的极直互化,发现并没有介绍相应内容的文章,所以有了自己调研一下并写一写的想法。果然只要想就能做到,所以有了下面这篇文章。 根据直角坐标系(笛卡尔系)内数值和极坐标系关系 根据上述公式不难想出,在直角坐标系中的圆会在极坐标

    2024年02月11日
    浏览(41)
  • C# | DBSCAN聚类算法实现 —— 对直角坐标系中临近点的点进行聚类

    聚类算法是一种常见的数据分析技术,用于将相似的数据对象归类到同一组或簇中。其中,DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,能够有效地识别出不同形状和大小的簇,同时还能标识出噪声数据。本篇博客将介绍聚类算法的概念

    2024年02月09日
    浏览(40)
  • 消除 BEV 空间中的跨模态冲突,实现 LiDAR 相机 3D 目标检测

    Eliminating Cross-modal Conflicts in BEV Space for LiDAR-Camera 3D Object Detection 近期,3D目标检测器通常利用多传感器数据和在共享的鸟瞰图(BEV)表示空间中统一多模态特征。然而,我们的实证研究发现,以前的方法在生成无跨模态冲突的融合BEV特征方面存在局限性。这些冲突包括由BEV特

    2024年04月15日
    浏览(55)
  • 向量空间中的基底和基变换以及坐标变换

    基底的每一个成员称作是基向量, n 维空间中的基底由 n 个基向量构成,这些基向量需要满足线性无关的条件,这样的话n 维空间中的任何向量 v都能表示成n个基向量的线性组合且表示方式是唯一的。 参考链接 :https://zhuanlan.zhihu.com/p/247915130 基变换就是把一组基变到另一组基

    2024年02月16日
    浏览(41)
  • 使用echarts实现3D地图和需要注意的点

    一种是map3D 一种是geo3D + series中的内容(比如bar3D、scatter3D) 具体配置 Documentation - Apache ECharts https://echarts.apache.org/zh/option-gl.html#series-bar3D.coordinateSystem 中的 GL配置 中 需要强调的是: map3D可以使用 this.chart.on(\\\'click\\\', 回调函数);方法获取点击内容,而geo3D是不可以的。 所以我

    2024年02月01日
    浏览(54)
  • 【CSS3】CSS3 3D 转换 ① ( CSS3 3D 转换简介 | 3D 物体与 2D 物体区别 | 3D 空间坐标系 | 常用的 3D 转换属性 | 3D 位移转换语法 | 代码示例 )

    3D 显示的物体 与 平面 2D 显示的物体有明显的不同 , 3D 显示效果有 近大远小 的 特点 ; 元素的 2D 的 转换效果 有 平移 , 旋转 , 缩放 效果 , 同样有对应的 3D 转换效果 ; 2D 平面坐标系 中 , 只有 x 轴 和 y 轴 ; 3D 空间坐标系 比 2D 平面坐标系 多了一个 Z 轴 ; x 轴 : 水平向右 ; 左侧是

    2024年02月12日
    浏览(49)
  • 使用Qt/C++实现WGS84、高德GCJ-02、百度BD-09坐标系间相互转化

            在做地图相关开发时候,绕不开不同坐标系间的转化,因此我根据查阅相关资料后将不同坐标系间的转换封装到一个GeoTranslate类中,该类转换函数不仅支持Qt/C++调用,同时可在QML中直接调用,配合上QML/Map很方便,我将该类做了个Demo,方便使用者使用,效果如图: 在

    2024年02月12日
    浏览(51)
  • 空间坐标变换(Python&C++实现)

    空间坐标变换可看作坐标点乘以一个齐次矩阵,其中,齐次矩阵可表示为: 其中: ①区域的3×3矩阵产生三维图形的比例、对称、旋转、错切等基本变换; ②区域产生图形的透视变换; ③区域产生沿X、Y、Z三个轴的平移变换; ④区域产生图形的总比例变换。 平移变换可表示

    2024年02月13日
    浏览(30)
  • 小程序腾讯坐标高德坐标之间转化

    要在JavaScript中使用 coordtransform 库将腾讯坐标(GCJ02)与高德坐标(火星坐标,也是GCJ02)进行转换,你可以按照以下示例代码进行操作: javascript复制代码 // 引入coordtransform库 const coordtransform = require(\\\'coordtransform\\\'); // 定义腾讯坐标(GCJ02)经纬度 const tencentLng = 113.123456; const

    2024年02月12日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包