// Det.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#define M 3//矩阵大小
#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include "ArrayInterTriangle.h"
#define FRAND   (((float)rand()-(float)rand())/RAND_MAX)
float  hanglieshi(float array[M][M])
{//计算行列式
float temp[M][2*M];
int i,j,c,c1;
float result=0,t=1;
for(i=0;i<M;i++)
{//构造临时矩阵,用来计算行列式
for(j=0;j<2*M;j++)
{
temp[i][j]=array[i][j%M];
}
}
for(c1=0;c1<M;c1++)
{//计算正值
i=0;
j=c1;
t=1;
for(c=0;c<M;c++)
{
t*=temp[i][j];
i++;
j++;
}
result+=t;
}
for(c1=0;c1<M;c1++)
{//计算负值
i=M-1;
j=c1;
t=1;
for(c=0;c<M;c++)
{
t*=temp[i][j];
i--;
j++;
}
result-=t;
}
return result;
}
void init(float array[M][M])
{//初始化矩阵,用随机值填充矩阵
int i,j;
float m=3.0;
//randomize();
for(i=0;i<M;i++)
for(j=0;j<M;j++)
array[i][j]=rand()%20000;
}
void output(float array[M][M])
{//输出矩阵
int i,j;
for(i=0;i<M;i++)
{
printf("\n\n");
for(j=0;j<M;j++)
printf("%4f",array[i][j]);
}
}
//非齐次方程
bool jieXianXingFangCheng(float xishu[M][M+1],float fangChengjie[M])
{
//函数所占用的空间量应该动态fenp
float D[M][M];
float Dn[M][M];
//根据克莱姆法则,求得D
for(int i=0;i<M;i++)
for(int j=0;j<M;j++)
{
D[i][j]=xishu[i][j];
Dn[i][j]=xishu[i][j];
}
if(hanglieshi(D)==0)return false;
float tempVect[M];
//下面求解:
for(int m=0;m<M;m++)
{   //替换第m列的值
for(i=0;i<M;i++)
{
tempVect[i]=Dn[i][m];
Dn[i][m]=xishu[i][M];
}
fangChengjie[m]=hanglieshi(Dn)/hanglieshi(D);
for(i=0;i<M;i++)
{
Dn[i][m]=tempVect[i];
}
//      cout<<fangChengjie[m]<<endl;
}
return true;
}
//定义屏幕拾取要用的变量。
//计算射线与平面交点的函数
bool calInsert(float org[3],float dir[3],float flat[4],float intersection[3]){
float xishu[3][4];
//定义三个数来表示是否该设为标准参考
int cankao[3];
bool flag=false;
for(int i=0,j=1;i<3;i++)
{
if(dir[i]!=0&&!flag)
{
cankao[0]=i;
flag=true;
}
else
{
cankao[j]=i;
j++;
}
}
if(!flag)return flag;
for(i=0;i<2;i++){
///int x=i+1;
//1,2为非参考降
//系数为cankao[0],cankao[i+1],cankao[3-i];
xishu[i][cankao[2-i]]=0;
xishu[i][cankao[0]]=-dir[cankao[i+1]]/dir[cankao[0]];
xishu[i][cankao[i+1]]=1;
xishu[i][3]=org[cankao[i+1]]-dir[cankao[i+1]]*org[cankao[0]]/dir[cankao[0]];
}
/*  for(i=0;i<3;i++)
{   cout<<endl;
for(j=0;j<4;j++)
{
cout<<xishu[i][j]<<"  ";
}
}
*/
//第一行
//x=nearPoint.x+n_vector.x*(y-nearPoint.y)/(farPoint.y-nearPoint.y);
//z=nearPoint.z+n_vector.z*(y-nearPoint.y)/(farPoint.y-nearPoint.y);
//xishu[cankao[1]][cankao[1]]=1;
//  xishu[cankao[1]][1]=-dir[cankao[1]]/dir[cankao[0]];
//xishu[cankao[1]][cankao[0]]=0;
//xishu[cankao[1]][3]=org[cankao[1]]-dir[cankao[1]]*org[cankao[0]]/dir[cankao[]];
//第二行
//第三行是一个平面方程。。
//
//假设系数为a,b,c,常量为d
//
//float a ,b ,c, d;
xishu[2][0]=flat[0];
xishu[2][1]=flat[1];
xishu[2][2]=flat[2];
xishu[2][3]=flat[3];
return jieXianXingFangCheng(xishu,intersection);
}
//下面的代码判断,平面上,一个点是否在三角形内。
//思路是求面积。面积之和是否与三角形相等。
//要用到求叉积
void _CrossProduct(float Vector1[3], float Vector2[3], float Cross[3])
{
Cross[0]    = Vector1[1] * Vector2[2] - Vector1[2] * Vector2[1];
Cross[1]    = Vector1[2] * Vector2[0] - Vector1[0] * Vector2[2];
Cross[2]    = Vector1[0] * Vector2[1] - Vector1[1] * Vector2[0];
}
void VectBinus(float a[3],float b[3],float c[3])
{
c[0]=a[0]-b[0];
c[1]=a[1]-b[1];
c[2]=a[2]-b[2];
}
//计算模
double calMole(float a[3])
{
return sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);
}
bool IsInTriangle(float a[3],float b[3],float c[3],float point[3]){
float  tempcross[4][3];
float v1[3];
float v2[3];
VectBinus(a,point,v1);
VectBinus(a,b,v2);
_CrossProduct(v1,v2,tempcross[0]);
VectBinus(b,point,v1);
VectBinus(b,c,v2);
_CrossProduct(v1,v2,tempcross[1]);
VectBinus(c,point,v1);
VectBinus(c,a,v2);
_CrossProduct(v1,v2,tempcross[2]);
VectBinus(c,b,v1);
VectBinus(c,a,v2);
_CrossProduct(v1,v2,tempcross[3]);
//计算面积是否相等
if(
fabs(
calMole(tempcross[0])+calMole(tempcross[1])+calMole(tempcross[2])-
calMole(tempcross[3])
)<0.00001
)return true;
return false;
}
//前面两个 表示一条射线,成功则返回point[3],true.
bool IsIntersectWithTriangle(float org[3],float dir[3],float a[3],float b[3],float c[3],float point[3],bool &IsFromFront)
{
float v1[3],v2[3];
float flat_4[4];
float flat[3];
VectBinus(a,b,v1);
VectBinus(b,c,v2);
_CrossProduct(v1,v2,flat);
cout<<endl;
cout<<"方向为:";
for(int i=0;i<3;i++)
{
cout<<dir[i]<<" ";
}
cout<<"法线为:";
for(i=0;i<3;i++)
{
cout<<flat[i]<<" ";
}
cout<<endl;
float dot=DotProduct(flat,dir);
cout<<"点积为:"<<endl;
cout<<dot<<endl;
if(dot<0)
IsFromFront=true;
else
IsFromFront=false;
if(dot==0)
{
return false;
}
if(flat[0]==0&&flat[1]==0&&flat[2]==0)
{
return false;
}
//根据法线与平面上的线的垂直关系,写出平面方程
flat_4[3]=a[0]*flat[0]+a[1]*flat[1]+a[2]*flat[2];
flat_4[0]=flat[0];
flat_4[1]=flat[1];
flat_4[2]=flat[2];
if(calInsert(org,dir,flat_4,point))
{
if(IsInTriangle(a,b,c,point)==true)return true;
else return false;
}else return false;
}
//求平面法线
void qiuFaXiangLiang(float a[3],float b[3],float c[3],float faXiangLiang[3])
{
float v1[3],v2[3];
//float flat[3];
VectBinus(a,b,v1);
VectBinus(b,c,v2);
_CrossProduct(v1,v2,faXiangLiang);
}
//求平面方程系数
bool qiuPingMianFangCheng(float a[3],float b[3],float c[3],float flat_4[4])
{
float v1[3],v2[3];
//float flat_4[4];
float flat[3];
VectBinus(a,b,v1);
VectBinus(b,c,v2);
_CrossProduct(v1,v2,flat);
if(flat[0]==0&&flat[1]==0&&flat[2]==0)
{
return false;
}
flat_4[3]=a[0]*flat[0]+a[1]*flat[1]+a[2]*flat[2];
flat_4[0]=flat[0];
flat_4[1]=flat[1];
flat_4[2]=flat[2];
return true;
}
bool IsTriangle(float a[3],float b[3],float c[3])
{
float v1[3],v2[3];
float flat[3];
VectBinus(a,b,v1);
VectBinus(a,c,v2);
_CrossProduct(v1,v2,flat);
if(calMole(flat)<0.000001)return false;
else return true;
}
#ifndef __ArrayInterTriangle_H__
#define __ArrayInterTriangle_H__
#define DotProduct(x,y) ((x)[0] * (y)[0] + (x)[1] * (y)[1] + (x)[2] * (y)[2]);
bool IsIntersectWithTriangle(float org[3],float dir[3],float a[3],float b[3],float c[3],float point[3],bool &IsFromFront);
void VectBinus(float a[3],float b[3],float c[3]);
bool qiuPingMianFangCheng(float a[3],float b[3],float c[3],float flat_4[4]);
void qiuFaXiangLiang(float a[3],float b[3],float c[3],float faXiangLiang[3]);
bool calInsert(float org[3],float dir[3],float flat[4],float intersection[3]);
bool IsTriangle(float a[3],float b[3],float c[3]);
#endif

我自己写的3D图形数学库。。。有点乱!相关推荐

  1. 《安富莱嵌入式周报》第306期:开源独轮车,Cortex-M85修订版r1发布,Terathon图形数学库,不断变革的IDE开发环境,各个厂家总动员

    往期周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - P ...

  2. 3D图形数学(3D Graphics Math)

    3D图形数学(3D Graphics Math) 1  图形管道概述 我们将讨论渲染一幅带有基本光照的单个图像的大体过程,这里不考虑动画和全局光照,如阴影和辐射度. 此外,注意这里只从概念上讲解通过图 ...

  3. Python画各种 3D 图形Matplotlib库

    回顾 2D 作图 用赛贝尔曲线作 2d 图.此图是用基于 Matplotlib 的 Path 通过赛贝尔曲线实现的,有对赛贝尔曲线感兴趣的朋友们可以去学习学习,在 matplotlib 中,figur ...

  4. 用JavaScript写一个3D图形

    可以使用 JavaScript 来创建 3D 图形.有许多方法可以实现这一目标,其中一种方法是使用 WebGL. WebGL(Web Graphics Library)是一种浏览器中的 3D 绘图技术 ...

  5. 3D图形数学6-背面剔除

    05/14/2020 背面剔除 什么是背面剔除 如何判定一个面是正面或者反面 叉乘与点乘 叉乘计算三角形法向量 摄像机到三角形的方向 点乘表示两个向量之间角度的情况 顺时针与逆时针的定义 注意 其它参 ...

  6. 基于web创建逼真的3D图形 | CSS技巧

    在成为一名web开发者之前,我从事于视觉设计行业,创造屡获殊荣,电影和电视节目等高端3D效果,例如 Tron, The Thing, Resident Evil,和 Vikings .为了能够创造这些 ...

  7. 开源项目推荐:我个人中意的Python/C++/.Net数学库(★精品收藏★)

    Numpy和SciPy 大名鼎鼎的 NumPy python版本 https://github.com/numpy/numpy https://github.com/dpilger26/NumCpp  ...

  8. 《基于 DirectX11 的 3D 图形程序设计案例教程》学习四 D3DTriangle

    源程序:   此次例子的大部分代码均拷贝自上一章 InitD3D 例子程序.   d3dUtility.h /********************************************* ...

  9. ✠OpenGL-4-管理3D图形数据

    目录 数据类型和函数名前后缀含义 缓冲区和顶点属性 统一变量 顶点属性插值(光栅着色器) 模型-视图和透视矩阵 第一个3D程序--一个3D立方体 打印[模型-视图矩阵]对象 分析:物体经模型-视图矩阵 ...

最新文章

  1. [JAVA EE] Thymeleaf 常用工具类
  2. java读取classpath配置文件_SpringBoot2.x入门教程:理解配置文件
  3. 豆瓣/name-?P=0/事件
  4. MVC:开发模式及其优缺点
  5. python公里转海里_海里、公里、英里之间的转换
  6. ExtJs入门 (02)-布局面板
  7. how is table select_all_icon being loaded
  8. 最后一周|高级转录组分析和R语言数据可视化第十二期 (线上线下同时开课)...
  9. 如何调整cmd窗口的颜色
  10. 电商 秒杀系统 设计思路和实现方法
  11. C语言:丹尼斯·里奇的不朽遗产
  12. 如何改手机b站html,教你如何手机提取B站视频内音频
  13. 【SEO工具】国内外网站速度测试工具都有哪些
  14. linux mysql删除恢复,如果不小心把mysql的权限表删除了恢复方法
  15. requires INJECT_EVENTS permission
  16. 基于Java的电影售票网站
  17. Python爬虫包 BeautifulSoup 递归抓取实例详解
  18. ThinkPad 声卡出现未安装任何音频输出设备
  19. 科学家与艺术家心中都装着什么
  20. 2014 北京邀请赛 B

热门文章

  1. cpld xilinx 定义全局时钟_AutoSAR中的时钟同步机制
  2. mysql数据库技术实验小结_Mysql数据库事务实验以及总结
  3. Python知识点1——基础
  4. php调用txt接口,PHP 如何更优雅地调用 API 接口
  5. proteus仿真micropython_【雕爷学编程】MicroPython动手做(04)——零基础学MaixPy之尝试运行...
  6. 产品运行所需的信息检索失败_域名解析失败
  7. 分享一个高质量的 小程序UI框架
  8. MySQL用户管理、常用sql语句、数据库备份
  9. 指定目录的所有 *.gif 文件都重命名为 *.jpg
  10. 使用Apache Spark构建实时分析Dashboard