判断三角形与射线相交的完整代码。。。
// 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;
}
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 array[M][M];
// clrscr();
// init(array);
// output(array);
// printf("\n%d",hanglieshi(array));//输出矩阵行列式的值
}
// 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;
}
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 array[M][M];
// clrscr();
// init(array);
// output(array);
// printf("\n%d",hanglieshi(array));//输出矩阵行列式的值
}
//求平面方程的方法分析:
垂直求点积为0法:
(x-a)*u+(y-b)*v+(z-c)*k=0;
a,b,c 为平面上的一点。
判断三角形与射线相交的完整代码。。。相关推荐
- 求解射线交点的完整代码
// Det.cpp : Defines the entry point for the console application. // #include "stdafx.h" # ...
- 判断完全二叉树及求二叉树深度完整代码
完全二叉树定义:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下.从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二 ...
- 用C语言实现三子棋(含思路+完整代码)
三子棋 目录 三子棋 三子棋含义: 基本思路: 1.创建用户交互菜单界面 2.初始化棋盘 3.显示棋盘面板 4.用户落子 5.电脑随机正确落子 6.判断胜负 7.创建Game界面 完整代码 代码结果显 ...
- 素数(质数)判断、打印素数表(Eratosthenes筛法)、质因子分解————附完整代码
文章目录 1 概念 2 素数的判断 2.1 思想 2.2 实现代码 3 素数表的获取 3.1 朴素算法 3.1.1 思想 3.1.2 3 实现代码 3.2 Eratosthenes筛法 3.2.1 思 ...
- c语言坐标三角形判断,【C语言】判断三角形类型(示例代码)
根据输入的三角形的三边判断三角形的类型,并输出其面积和类型. #include #include #include int main() { float a, b, c; float s, area; ...
- java中直角三角形第三条边,Java编程,根据输入三角形的三个边边长,程序能判断三角形类型为:等边、等腰、斜角、直角三角形,求代码...
private static Scanner sc;private static int edge[] = new int[3];public static void main(String[] ar ...
- 如何判断两条线段是否相交
本篇是在 [C++笔记]如何判断2个线段相交 的基础上加上自己的理解和实践总结出的判断两线段是否相交的方法. 判断两条线段是否相交 先附上判断函数 bool judge(int Ax1,int Ay1 ...
- 机器学习图像分割——模型评价总结(含完整代码)
机器学习&图像分割--模型评价总结(含完整代码) 模型评价的方法指标有很多,如:PR-curve,MAE,ROC,Precision,Recall,AUC,AP,mAP,DSI,VOE,RVD ...
- c++学习之根据任意三个坐标的判断三角形的类型(面积、周长)
本次介绍一下,根据输入的任意三个点坐标,判断是否可以构成三角形,以及计算周长,面积. 文章目录 一.设计的构想 1.1.思路介绍 1.2.流程图 二.代码的实现 2.1.函数的介绍 2.2.完整的代码 ...
最新文章
- WatchStor观察:思科携EMC等合作伙伴 圈地数据中心市场
- Django实战之增加链接
- SAP系统中发送消息的几种办法
- INNODB的锁的类型
- python调用linux软键盘_在Linux中使用Python模拟键盘按键
- 我如何使用React,Redux-Saga和Styled Components构建NBA球员资料获取器
- 再谈SQL Server中日志的的作用
- oracle存储过程的创建与调用,Oracle 存储过程创建及调用
- 16. Magento模板及布局文件中引用Static Block的方法
- Spring教程笔记8 基于SHH的员工信息管理系统
- 安全防御-----防病毒
- 800元以内创建的双路CPU主机
- python 显示gif_使用tkinter显示动态gif
- 2011年50大最佳网站
- linux系统改键盘系统,Linux 修改键盘设置
- 美图秀秀怎么无缝拼图
- word2019 分页、分节(即分节符下的分页)、页码、页眉设置最佳实践
- Android小技巧 自动关闭输入法软键盘
- LeetCode 517 超级洗衣机 解法
- 《Java程序性能优化》
热门文章
- kuka机器人焊接飞溅大_机器人专用三维焊接平台低温现象得到解决
- 17、计算机图形学——辐射度量学
- oracle 数据分析函数,ORACLE分析函数(一)
- python中rename函数_python os.rename(…)不起作用!
- 对抗生成网络_深度卷积生成对抗网络
- Glossary in Turbulence
- caffe---ubuntu1604下anaconda2.5的尝试----失败,建议使用系统的python系统,避免各种各样的陷阱...
- PARSEC測试集的应用领域和working set的大小
- 23种设计模式之适配器模式(Adapter)
- Qt5: SpringAnimation