// 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>
#define DotProduct(x,y) ((x)[0] * (y)[0] + (x)[1] * (y)[1] + (x)[2] * (y)[2]);
#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);
float dot=DotProduct(flat,dir);
if(dot<0)
IsFromFront=true;
else
IsFromFront=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;
}
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.5,0.5,0.7};
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]={1,0,0};
float b[3]={0,1,0};
float c[3]={0,0,1};
float point[3];
bool IsFront;
if( !IsIntersectWithTriangle(org,dir,a,b,c,point,IsFront)){
cout<<"不相交"<<endl;
}else
{
cout<<"相交"<<endl;
}
if( IsFront){
cout<<"前面"<<endl;
}else
{
cout<<"后面"<<endl;
}
for(i=0;i<3;i++){
cout<<point[i]<<endl;
}
float v1[3]={1,-1,0};
float v2[3]={1,0,-1};
float temp[3];
CrossProduct(v1,v2,temp);
for(i=0;i<3;i++){
cout<<temp[i]<<endl;
}
cout<<FRAND;
// float array[M][M];
//  clrscr();
// init(array);
// output(array);
// printf("\n%d",hanglieshi(array));//输出矩阵行列式的值
}

再次修订后的版本。。。。。。1.0(发布版,射线求交三角形)相关推荐

  1. android9是最新版本,Android9.0正式版发布,你的手机升级到主流Android8.0系

    原标题:Android9.0正式版发布,你的手机升级到主流Android8.0系 今天凌晨,谷歌正式推送Android9.0更新,这款最新的安卓系统被命名为Android Pie,Pie意义为&quo ...

  2. CYQ.Blog(QBlog) 单用户版本V3.0 发布下载[免费,简洁,高性能,双语言,8套皮肤,4种数据库支持]...

    2019独角兽企业重金招聘Python工程师标准>>> 前言说明:   秋色园QBlog,一直以来,都发布多用户博客版本,今天,终于提升了一个power,发布单用户博客版本了.   ...

  3. phpems最低的mysql版本_PHPEMS6.0发布

    2019-09-24(6.0)更改功能 1.优化手机端 2.题帽题支持多题型 3.优化正式考试 4.优化课程 5.修复已知bug 数据库升级(5.0-6.0) #数据库升级(5.0 -> 6.0 ...

  4. Java easycms 版本2.0发布

    为什么80%的码农都做不了架构师?>>>    精简js框架,删除不开源的ace ui 框架,改为更简洁,理论支持n级节点的层级菜单 默认使用嵌入式数据库h2 使用jetty作为se ...

  5. cs5 dreamweaver ox_dreamweaver cs5软件下载-dreamweaver cs5最新版本v11.0 官方版 - 极光下载站...

    dreamweaver cs5官方版为广大用户带来了全新升级的电脑端网页制作软件,这款dreamweaver cs5的功能非常强大,用户可以利用软件来将页面图像处理的完美无缺,并且一些基础操作并不复杂 ...

  6. 百度输入法发布AI版本10.0,重磅推出“AI助聊”功能

    近日,拥有深厚AI实力.相关功能落地广泛的百度输入法迎来年度重大AI版本10.0发布,在领先的自然语言处理等AI能力加持下重磅推出"AI助聊"功能.升级后的百度输入法将更懂用户所想 ...

  7. 鸿蒙系统发布会是什么时候,鸿蒙系统2.0发布时间是什么时候?或将与EMUI11一同发布!...

    对于鸿蒙系统OS一直以来就备受大家的关注,作为华为自主研发的操作系统,它是华为之光!很多人翘首盼望着它的到来,自1.0版本后鸿蒙系统2.0发布时间似乎确定下来了!届时会与EMUI11一同向大家介绍! ...

  8. Cockroach DB 1.0发布

    分布式SQL数据库Cockroach DB遵循软件产品以动物命名的模式.近日,该数据库的第一个生产就绪版本1.0发布. 许多人将Cockroach DB视为Google Spanner的开源版本.后者 ...

  9. 基于JQUERY的WEB在线流程图设计器GOOFLOW 0.9版

    换工作后又结婚,一个版本拖了两年才出来--  跨浏览器,可兼容IE8--IE11, FireFox, Chrome, Opera等几大内核的浏览器,且不需要浏览器再加装任何控件. (IE8时,使用V ...

最新文章

  1. 如何精确测量一段代码的执行时间
  2. Spring Framework Part2 IOC
  3. python主要应用的几个领域
  4. 组合模式 桥接模式 java_java设计模式5.组合模式、门面模式、享元模式、桥接模式...
  5. [攻防世界 pwn]——time_formatter(内涵peak小知识)
  6. html:(14):给div命名和table标签
  7. 为什么我墙裂建议大家使用枚举来实现单例。
  8. 用SMS2003部署Windows XP SP3:SMS2003系列之十
  9. 五.开发记录之ubuntu系统安装各个软件
  10. LPV(Light Propagation Volumes)
  11. sublime html乱码,HTML5 sublime 编码出现乱码怎么处理
  12. Atitit.播放系统规划新版本 and 最近版本回顾 v3  pbf.doc
  13. 在Pyramid中使用Mako模板以及默认和.html后缀关联
  14. STAMP可以用在win10上面吗
  15. c#语言猜数字游戏,C#实现简易猜数字游戏
  16. 自学编程应该从哪里开始?
  17. 汇编语言 王爽第二版 总结
  18. 流利说英语level4_英语流利说level4原文graph?分享一下我的经验?
  19. 【渝粤教育】 广东开放大学 21秋期末考试大学英语210262k2
  20. sklearn中实现多分类任务(OVR和OVO)

热门文章

  1. 页面整体居中 左右出现白边html,html2canvas生成图片出现白边儿的解决方法
  2. mysql v8 漏洞_mysql'密码安全 - osc_v8gts6gd的个人空间 - OSCHINA - 中文开源技术交流社区...
  3. python装饰器与闭包_Python 装饰器和闭包
  4. C++知识点44——类的继承概述
  5. halcon模板匹配——转化算子vector_angle_to_rigid和affine_trans_contour_xld
  6. protobuf + maven 爬坑记
  7. 【vue插件篇】vue-form-check 表单验证
  8. Day1-python基础
  9. Internet设置-连接选项卡-局域网(LAN)设置 某些设置由系统管理员进行管理
  10. LR+Jenkins实践思路