光线求交-面、三角形、球 (Ray intersection)
光线求交
- 光线定义:position \(a(t)\) = \(o\) + \(t\vec{d}\);
- 球定义: center p, radius r;
- 平面定义:normal \(\vec{n}\) , offset t;
- 三角形定义:position \(a_1\), \(a_2\), \(a_3\), normal \(\vec{n}\);
光线与球相交 (Ray/Sphere Intersection)
c++代码 :
bool HitTest(const Ray& ray, HitTestResult* result)
{
Vector eo = Center - ray.Position;
float v = eo * ray.Direction;
auto disc = Radius * Radius - (eo * eo) + v * v;
if (disc < 0) return false;
disc = v - sqrt(disc);
if (disc < 0.001f || disc >= ray.MaxDistance) return false;
result->Shape = const_cast<Sphere*>(this);
result->Normal = (disc * ray.Direction - eo).Normalize();
result->Distance = disc;
return true;
}
光线与平面相交 (Ray / Plane Intersection)
线与平面相交 Ray/Plane Intersection
平面在空间几何中可以用一个向量(法向量)和平面中的一点P0来表示。
平面就是满足下式的点集:\(\vec{n}(\vec{P}-\vec{P_0})= 0\)
得到:\(\vec{n}\cdot\vec{P}=d\); \(d=\vec{n}\cdot\vec{P_0}\);
给定射线r(t) = o +td,平面方程为n.p+d=0,将p(t)带入到平面方程,最后求得t:
\(t = (-d-(\vec{n}\cdot\vec{p_0}))/(\vec{n}\cdot\vec{d})\)
c++代码:
bool HitTest(const Ray& ray, HitTestResult* result)
{
auto denom = Normal * ray.Direction;
if (denom > 0) return false;
auto d = (Normal * ray.Position + Offset) / (-denom);
if (d >= ray.MaxDistance) return false;
result->Shape = const_cast<Plane*>(this);
result->Normal = Normal;
result->Distance = d;
return true;
}
光线与三角形相交 (Ray/Triangle Intersection)
- 判断射线是否与平面相交
- 判断点是否在三角形内
//构造函数:
Triangle(const Vector& Point1, const Vector& Point2, const Vector& Point3)
: Point1(Point1), Point2(Point2), Point3(Point3)
{
auto n1 = Point2 - Point1;
auto n2 = Point3 - Point1;
normal = Vector::Cross((Point2 - Point1), (Point3 - Point1)).Normalize();
}
bool HitTest(const Ray& ray, HitTestResult* result)
{
float eo;
if (normal.Length() != 0 && (eo = ray.Direction * normal) < 0)
{
auto S = (Point1 - ray.Position) * normal / eo;
if (S < 0.001f || S >= ray.MaxDistance)
return false;
auto V = S * ray.Direction + ray.Position;
if (IsInner(V))
{
result->Shape = const_cast<Triangle*>(this);
result->Normal = normal;
result->Distance = S;
return true;
}
return false;
}
return false;
}
另一种方法:[用三角形重心求交
光线求交-面、三角形、球 (Ray intersection)的更多相关文章
- ray与triangle/quad求交二三事
引擎中,ray与quad求交,算法未细看,但有求解二次方程,不解.ray与triangle求交,使用的是97年经典算法,仔细看过论文,多谢小武同学指点,用到了克拉默法则求解线性方程组.想模仿该方法,做 ...
- 一步一步实现基于GPU的pathtracer(二):求交算法
不管是哪种全局光照算法,最根本的都要落实到光线与物体的求交.主要分为光线与参数曲面和非参数曲面的求交,典型的参数曲面有球.盒.圆柱等基本体及基本体的组合体,以及一些更为复杂的参数曲面.非参数曲面就是所 ...
- [NetTopologySuite](2)任意多边形求交
任意多边形求交: private void btnPolygon_Click(object sender, EventArgs e) { , , , , , , , , , , , , , }; , ...
- HDU - 3982:Harry Potter and J.K.Rowling(半平面交+圆与多边形求交)(WA ing)
pro:给定一枚蛋糕,蛋糕上某个位置有个草莓,寿星在上面切了N刀,最后寿星会吃含有草莓的那一块蛋糕,问他的蛋糕占总蛋糕的面积比. sol:显然需要半平面交求含有蛋糕的那一块,然后有圆弧,不太方便求交. ...
- OpenCASCADE 平面求交
OpenCASCADE 平面求交 eryar@163.com OpenCASCADE提供了类IntAna_QuadQuadGeo用来计算两个二次曲面quadric(球面.圆柱面.圆锥面及平面,平面是二 ...
- 【Weiss】【第03章】练习3.4、3.5:有序链表求交、并
[练习3.4] 给定两个已排序的表L1和L2,只使用基本的表操作编写计算L1∩L2的过程. [练习3.5] 给定两个已排序的表L1和L2,只使用基本的表操作编写计算L1∪L2的过程. 思路比较简单,测 ...
- 一个好用的多方隐私求交算法库JasonCeng/MultipartyPSI-Pro
Github链接传送:JasonCeng/MultipartyPSI-Pro 大家好,我是阿创,这是我的第29篇原创文章. 今天是一篇纯技术性文章,希望对工程狮们有所帮助. 向大家推荐一个我最近改造的 ...
- 试题系列四(袋中有6红球 3黄球 3绿球,从中取6个球,求所有拿到球的颜色的可能 c(12,6))
1.袋中有6红球 3黄球 3绿球,从中取6个球,求所有拿到球的颜色的可能 c(12,6) #include<stdio.h> int main(int argc, char** argv) ...
- hdu 5111 树上求交
hdu 5111 树上求交(树链剖分 + 主席树) 题意: 给出两棵树,大小分别为\(n1\),\(n2\), 树上的结点权值为\(weight_i\) 同一棵树上的结点权值各不相同,不同树上的结点权 ...
随机推荐
- HDU 3926 并查集 图同构简单判断 STL
给出两个图,问你是不是同构的... 直接通过并查集建图,暴力用SET判断下子节点个数就行了. /** @Date : 2017-09-22 16:13:42 * @FileName: HDU 3926 ...
- CSS 文本属性
一.文本位置 text-align: 参数 /** * left center right:左中右**/text-align: left; 二.文本行间距 line-height: 参数 特别要注意: ...
- StringUtils.htmlEncode()--html标签过滤方法实现
package org.guyezhai.utils; import java.text.CharacterIterator; import java.text.StringCharacterIter ...
- 搭建简单的node+express+mongodb项目
安装 首先要确保已经安装了 Node.js,接下来创建一个目录,然后进入此目录并将其作为当前工作目录. mkdir myapp cd myapp 通过 npm init 命令为应用创建一个 packa ...
- 如何修改 winserver2008 密码策略为简单密码
对于不在域中的计算机, 可以运行: gpedit.msc , 如下图: 对于在域中的计算机, 应该: 如不能生效, 可重启再试.
- 【CodeForces】901 B. GCD of Polynomials
[题目]B. GCD of Polynomials [题意]给定n,要求两个最高次项不超过n的多项式(第一个>第二个),使得到它们GCD的辗转次数为n.n<=150. [算法]构造 [题解 ...
- 【洛谷 P4166】 [SCOI2007]最大土地面积(凸包,旋转卡壳)
题目链接 又调了我两个多小时巨亏 直接\(O(n^4)\)枚举4个点显然不行. 数据范围提示我们需要一个\(O(n^2)\)的算法. 于是\(O(n^2)\)枚举对角线,然后在这两个点两边各找一个点使 ...
- IP判断 (字符串处理)
关于IP合法性判断的题目,每个oj上的约束条件不尽相同,我就根据自己做过的题目吧所有的约束条件汇总到一块,到时候做题时只需要把多余的越是条件删掉即可 题目描述: 对于IP我们总会有一定的规定,合法的I ...
- 45、如何使用python删除一个文件?
若想利用python删除windows里的文件,这里需要使用os模块!那接下来就看看利用os模块是如何删除文件的! 具体实现方法如下! os.remove(path) 删除文件 path. 如果pat ...
- 谷歌PageRank算法
1. 从Google网页排序到PageRank算法 (1)谷歌网页怎么排序? 先对搜索关键词进行分词,如“技术社区”分词为“技术”和“社区”: 根据建立的倒排索引返回同时包含分词后结果的网页: 将返回 ...