// 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>
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;
}
}
//定义屏幕拾取要用的变量。
//计算射线与平面交点的函数
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];
}
//计算模
float calMole(float a[3])
{
return 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(
(
calMole(tempcross[0])
+calMole(tempcross[1])
+calMole(tempcross[2])
)==calMole(tempcross[3])
)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])
{
float v1[3],v2[3];
float flat_4[4];
float flat[3];
VectBinus(a,b,v1);
VectBinus(b,c,v2);
CrossProduct(v1,v2,flat);
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))
return IsInTriangle(a,b,c,point);
else
return false;
}
void main()
{
float xishu[M][M+1];
float fangchengjie[M];
for(int i=0;i<M;i++)
{
for(int j=0;j<M;j++)
{
if(i!=j)xishu[i][j]=0;
else xishu[i][j]=1;
}
}
for(i=0;i<M;i++)
xishu[i][M]=1;
// jieXianXingFangCheng(xishu,fangchengjie);
float org[3]={0,0,0};
float dir[3]={0,1,0};
float xishuA[4]={0,1,0,4};
float jiaodian[3];
calInsert(org,dir,xishuA,jiaodian);
for(i=0;i<3;i++){
cout<<jiaodian[i]<<endl;
}
float a[3]={0,0,1};
float b[3]={1,0,0};
float c[3]={0,1,0};
float point[3];
if( IsIntersectWithTriangle(org,dir,a,b,c,point)){
cout<<"false!"<<endl;
}
for(i=0;i<3;i++){
cout<<point[i]<<endl;
}
// float array[M][M];
//  clrscr();
// init(array);
// output(array);
// printf("\n%d",hanglieshi(array));//输出矩阵行列式的值
}

射线与三角形求交,并判断是否在三角形内的完整代码(带测试)相关推荐

  1. 输入三角形的三边,判断能否构成三角形,若可以则输出三角形的类型

    //输入三角形的三边,判断能否构成三角形,若可以则输出三角形的类型 //2019.12.25 #include <stdio.h> int main() { int a,b,c; prin ...

  2. 一元二次方程求根c语言编码,一元二次方程求解程序完整代码

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 下面的代码是我刚才无聊写的.对于简单的一元多次方程的迭代 #include #include #include #define MAXTIMES 5 ty ...

  3. C++期末考试1:求圆柱体体积(完整代码含测试)

    大家好,我是执念斩长河.昨天周四12.30进行了C++期末考试机试,题目比较简单,我直接做了出来,放在博客里,有同学需要可点击收藏.考试1内容就是博文标题. 题目再现 用C++类实现圆柱体体积,需要用 ...

  4. 光追渲染器开发记录:BVH加速结构构建与射线求交

    目录 为什么需要加速: BVH概念: BVH的一个节点: 轴对称包围盒AABB: BVH的构建: 核心思想: 求取最大的包围盒: BVH求交: 包围盒求交: 基本思想: 平面求交: 具体做法: 具体的 ...

  5. c++ 求四边形面积和周长_面向对象c++——三角形求周长和面积

    这几天放假耍了几天,没有ACM题可贴,就只有贴作业了,很水的作品请指教 源代码: /*************************************** c++编程题 定义一个三角形类求三角 ...

  6. C语言 算法判断是否构成三角形,如能则求出三角形的周长和面积并输出;如不能,输出不能构成三角形的信息

    从键盘输入三角形的三条边长,判断是否构成三角形,如能则求出三角形的周长和面积并输出:如不能,输出不能构成三角形的信息.构成三角形的条件为:三角形任意两边的和大于第三边时,构成三角形. 算法分析: #i ...

  7. C#通过类的继承来实现判断任意一个三角形并求出它们的周长及面积(等腰三角形,等边三角形,直角三角形,等腰直角三角形)

    这是等腰三角形,等边三角形,直角三角形,等腰直角三角形,它们的父类 using System; using System.Collections.Generic; using System.Linq; ...

  8. java 三角形三边求三角_java通过三边长度判断是否是三角形

    java通过三边长度判断是否是三角形 发布时间:2020-06-23 20:02:42 来源:亿速云 阅读:75 作者:Leah 这篇文章运用简单易懂的例子给大家介绍java通过三边长度判断是否是三角 ...

  9. 光线求交加速算法:kd-树

    光线求交加速算法:kd-树 空间二分树,即Binary space partitioning (BSP)树利用分割平面自适应地细分空间. BSP树以包围整个场景的边界框开始.如果框中的图元数量大于某个 ...

最新文章

  1. 斯坦佛编程教程-Unix编程工具(四)
  2. composer 完整路径才能访问_一份完整的运营方案策划思路,拿走不谢(精华版)
  3. 微信小程序视频弹幕效果
  4. 国家网信办:所有网站应对传播内容承担法律责任
  5. OpenShift 4 - 运行Spark和Zeppelin大数据应用
  6. Android 学习 笔记_09. WIFI网络操作
  7. DBA_OBJECTS
  8. Java数据结构与算法——图
  9. 领英怎么加群组,加群组有什么用?(LinkedIn Groups篇)
  10. Scintilla教程(2): 文本检索与修改
  11. python适合多大小孩学好拼音打字_都已经十七八岁的年龄了,突然发现自己居然不会拼音打字,现在想好好学,但是感觉无从下手。有什么方法么?...
  12. 手机可以拍证件照吗,这方法不错
  13. 50岁的程序员该何去何从
  14. 社交瓶颈下,为何巨头都选择用“眼镜”做平台?
  15. swoole 2.x使用php什么版本,Think-Swoole 教程(二)安装
  16. 用淘礼金助手做0元购物软件这3点必须要知道
  17. Web端程序实现文件下载
  18. c语言表示注释,c语言中注释的位置
  19. (java)使用createNewFile提示系统找不到指定路径
  20. 正大国际期货主账户:什么是外盘

热门文章

  1. 小米五android o卡吗,【图片】小米5优化教程,吃鸡卡的进来!!!_小米5吧_百度贴吧...
  2. mysql节假日表_节假日常见的数据库磁盘空间处理小结
  3. Kubernetes上领先的开源Serverless解决方案有哪些
  4. C++_类和动态内存分配2-改进后的String类
  5. Putty添加SSH Key
  6. [BZOJ3262]陌上花开
  7. Patchwork间谍组织将目标扩大至政府
  8. elixir官方入门教程 模式匹配
  9. ListView详解(二)
  10. Deploying Windows Mobile 6 with Exchange Server 2007 白皮书