青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

雁過無痕

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::

前一篇文章討論了二維坐標系下的判斷,下面討論三維的情況。

三維坐標下,對點的判斷明顯要復雜很多。如果google“Point in triangle”,第一個搜索結果就是這個,可惜的是,作者沒有對結果進一步討論,沒有給出一個好的實現,而且其所有結論只在已知四點共面時才成立。

 

 

 

 

前面已經證明過,面積法和向量同向法是等價的。

ab × ac = ab × ap + ap × ac + pb × pc

|ab × ac| = |ab × ap| + |ap × ac| + |pb × pc|

由于ab × ac、ab × ap、ap × ac、pb × pc這4個向量平行同向,因而可以先判斷a、b、c、p這四點是否共面(通過計算混合積),若共面的話,則4個向量一定共線,接著只要判斷后三個向量是否都和第一個向量(ab × ac)同向(可以通過判斷后三個向量與第一個向量的點積的正負性來確定)。

 

代碼:

 

#include<cfloat>

template<typename T> class Vec3 {

 T x, y, z;

public:

 Vec3(T xx, T yy, T zz) : x(xx), y(yy), z(zz) {}

 Vec3 operator-(const Vec3& v) const { return Vec3(x - v.x, y - v.y, z - v.z); }

 T dot(const Vec3& v) const { return x * v.x + y * v.y + z * v.z; }

 

 Vec3 cross(const Vec3& v) const {

    return Vec3(y * v.z - z * v.y, z * v.x - x * v.z,x * v.y - y * v.x);

 }

};

 

typedef Vec3<double> V3d;

 

//方法一

bool is_in_triangle3a(const V3d& a, const V3d& b, const V3d& c, const V3d& p)

{

 V3d ab(b - a), ac(c - a), ap(p -a);

 if (fabs(ab.cross(ac).dot(ap)) >= DBL_EPSILON) return false; //四點不共面

 V3d abc = ab.cross(ac), abp = ab.cross(ap), apc = ap.cross(ac);

 double t0 = abc.dot(abc), t1 = abp.dot(abc), t2 = apc.dot(abc);

 

 //t1 >= 0     t2 >= 0    t1 + t2 <= t0       t0肯定大于0

 // return (t1 >= -DBL_EPSILON) & (t2 >= -DBL_EPSILON) & (t0 - t1 - t2 >= -DBL_EPSILON);

 double delta = fabs(t1) + fabs(t2) + fabs(t0 - t1 - t2) - t0;

  return fabs(delta) < DBL_EPSILON; 

}

 

方法一,需要30次乘法計算。即使在已知四點共面的情況下,仍需要27次乘法計算,僅節(jié)省了3次乘法計算。考慮到每次計算向量積需要6次乘法計算,而計算點積只要3次乘法計算,因而可以考慮消除向量積計算:

 

 

利用公式:

 (a × b)· c = (c × a)· b       (混合積)

 a × (b × c) = b(a·c) c(a·b)  (拉格朗日公式)

可得:

(a × b)·(a × c) = ((a × c) × a)·b = ((a·a)c – (a·c)a)·b

= (a·a) * (b·c) – (a·c) * (a·b)

 

利用這個展開式,可得:

 

//方法二

bool is_in_triangle3b(const V3d& a, const V3d& b, const V3d& c, const V3d& p)

{

 V3d ab(b - a), ac(c - a), ap(p -a);

 if (fabs(ab.cross(ac).dot(ap)) >= DBL_EPSILON) return false; //四點不共面

 V3d abc = ab.cross(ac), abp = ab.cross(ap), apc = ap.cross(ac);

 

 //double t0 = abc.dot(abc), t1 = abp.dot(abc), t2 = apc.dot(abc); //對這三個計算公式進行展開

 double v11 = ab.dot(ab), v22 = ac.dot(ac), v12 = ab.dot(ac);

 double v13 = ab.dot(ap), v23 = ac.dot(ap);

 double t0 = v11 * v22 - v12 * v12;

 double t1 = v11 * v23 - v12 * v13;

 double t2 = v22 * v13 - v12 * v23;

 

 double delta = fabs(t1) + fabs(t2) + fabs(t0 - t1 - t2) - t0;

 return fabs(delta) < DBL_EPSILON; 

}

 

方法二,需要30次乘法計算,但在已知四點共面時則只需要21次乘法計算。

 

上面的兩種方法,方法一,容易記,容易實現,且在不能確定四點共面時,效率與方法二差不多(甚至可能略高);而方法二最大的優(yōu)點,則是在已知四點共面時,比方法一少用6次乘法,但是實現起來實在麻煩。那么,是否存在更好的方法呢?答案是肯定的,這就是后面要提到的方法(多一次條件判斷,只要13乘法(四點共面時只要8))。

 


作者: flyinghearts
出處: http://www.cnblogs.com/flyinghearts/
本文采用知識共享署名-非商業(yè)性使用-相同方式共享 2.5 中國大陸許可協(xié)議進行許可,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
posted on 2011-07-14 23:28 flyinghearts 閱讀(1646) 評論(0)  編輯 收藏 引用 所屬分類: 算法
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            激情久久久久久久| 欧美精品一区二区三区高清aⅴ| 欧美精品一区在线播放| 91久久精品美女| 亚洲国产精品黑人久久久 | 老司机精品福利视频| 午夜久久黄色| 精品电影一区| 亚洲国产精品热久久| 欧美久久久久久久久| 亚洲欧美综合另类中字| 欧美一级二级三级蜜桃| 国内精品久久久久影院 日本资源| 久久精品国产一区二区三区| 久久一区二区三区国产精品| 亚洲免费观看| 一区二区三区四区五区精品| 国产亚洲女人久久久久毛片| 美女日韩欧美| 91久久香蕉国产日韩欧美9色| 免费人成精品欧美精品| 亚洲天堂成人在线观看| 午夜精品影院| 亚洲精品美女在线观看播放| 这里只有精品电影| 樱桃成人精品视频在线播放| 亚洲精品乱码久久久久久蜜桃麻豆| 国产精品对白刺激久久久| 久久国产免费看| 欧美日韩不卡一区| 久久人人97超碰国产公开结果| 欧美精品一区二区视频 | 一区二区三区久久| 欧美在线播放| 亚洲一区二区三区免费视频| 久久免费的精品国产v∧| 亚洲色图综合久久| 久久这里有精品视频| 亚洲在线视频免费观看| 久久这里只精品最新地址| 亚洲欧美网站| 欧美激情无毛| 欧美成人一品| 国产亚洲网站| 亚洲一区成人| 中文精品99久久国产香蕉| 久久亚洲二区| 久久经典综合| 国产乱理伦片在线观看夜一区| 亚洲国产乱码最新视频| 伊人男人综合视频网| 亚洲欧美国产77777| 亚洲视频在线观看视频| 欧美成人午夜| 欧美1区3d| 国产一区二区三区黄| 亚洲一区二区三区免费在线观看| 日韩视频一区| 欧美高清视频免费观看| 欧美国产三区| 亚洲国产精品小视频| 久久不见久久见免费视频1| 羞羞视频在线观看欧美| 欧美性猛片xxxx免费看久爱| 日韩亚洲视频| 在线午夜精品自拍| 欧美日韩视频在线一区二区| 亚洲日本一区二区| 一区二区免费在线视频| 欧美精品国产一区| 亚洲精品日本| 亚洲一区二区动漫| 欧美性猛交99久久久久99按摩| 一区二区三区欧美视频| 亚洲一区视频在线| 国产精品日韩电影| 欧美一区二区在线观看| 久久人人97超碰精品888| 在线免费观看欧美| 欧美高清视频www夜色资源网| 91久久精品国产91久久性色| 夜久久久久久| 国产精品无码专区在线观看| 亚洲欧美日韩专区| 麻豆91精品| 欧美三级资源在线| 国产精品99久久不卡二区| 小黄鸭精品aⅴ导航网站入口| 国产欧美日韩一区| 久久综合色天天久久综合图片| 欧美国产第二页| 国产精品99久久久久久久女警| 国产精品女同互慰在线看| 久久精品国产一区二区三| 亚洲国产成人精品女人久久久 | 久久久99爱| 亚洲高清不卡一区| 午夜精品福利在线| 狠狠入ady亚洲精品经典电影| 男女精品视频| 亚洲一区二区欧美日韩| 老司机一区二区三区| 日韩网站在线观看| 国产精品影片在线观看| 美女图片一区二区| 亚洲色图自拍| 欧美国产免费| 欧美一乱一性一交一视频| 亚洲国产精品悠悠久久琪琪| 国产精品激情偷乱一区二区∴| 久久九九热re6这里有精品| 亚洲裸体俱乐部裸体舞表演av| 久久精品国产亚洲精品| 一区二区欧美在线| 在线成人亚洲| 国产精品一级| 欧美啪啪一区| 久久视频在线免费观看| 亚洲免费视频中文字幕| 最新国产成人av网站网址麻豆| 久久精品99| 亚洲女人av| 宅男噜噜噜66一区二区| 亚洲高清资源综合久久精品| 国产色产综合产在线视频| 欧美日韩一区二区免费在线观看| 久久久久国内| 亚洲欧美一区在线| 亚洲线精品一区二区三区八戒| 亚洲国产成人精品久久久国产成人一区| 欧美一区二区三区免费视频| 亚洲视频免费| 一区二区日韩| 99人久久精品视频最新地址| 亚洲国产欧美在线| 在线观看日韩专区| 黑人巨大精品欧美一区二区| 国产日韩欧美不卡| 国产精品午夜春色av| 国产精品扒开腿爽爽爽视频| 欧美日韩国产一区二区三区地区 | 久久久一二三| 久久精品人人做人人爽电影蜜月| 亚洲欧美日韩视频二区| 亚洲一区二区免费在线| 亚洲在线成人精品| 亚洲欧美激情一区二区| 亚洲主播在线播放| 亚洲欧美综合v| 久久成人av少妇免费| 欧美一区二区视频在线观看2020| 午夜欧美大片免费观看 | 亚洲无限av看| 亚洲欧美视频在线| 久久久www成人免费无遮挡大片| 久久黄金**| 久久久久久久久久久久久久一区| 久久久久免费视频| 蜜臀久久99精品久久久久久9| 欧美mv日韩mv国产网站| 91久久亚洲| 亚洲一级黄色| 久久精品最新地址| 欧美精品福利在线| 国产精品久久久久毛片软件| 国产日韩欧美亚洲一区| 一区二区三区在线免费视频 | 国产麻豆成人精品| 一区二区三区在线免费播放| 夜夜嗨av色一区二区不卡| 亚洲欧美一区二区三区极速播放| 久久精品国产一区二区三| 欧美黑人在线播放| 一区二区三区鲁丝不卡| 久久国产精品免费一区| 欧美91大片| 国产精品亚洲美女av网站| 一区二区亚洲精品国产| 中日韩视频在线观看| 卡一卡二国产精品| 亚洲精品一区二区网址 | 亚洲一级二级| 免费在线视频一区| 国产精品夜夜夜| 亚洲精华国产欧美| 午夜欧美不卡精品aaaaa| 免费观看成人网| 亚洲一区尤物| 欧美高清自拍一区| 国内一区二区在线视频观看| 夜夜躁日日躁狠狠久久88av| 久久久精品一品道一区| 日韩视频专区| 免费人成精品欧美精品| 国产综合久久久久久鬼色| 这里只有视频精品| 欧美激情在线| 久久丁香综合五月国产三级网站| 欧美日韩中文精品| 亚洲激情欧美激情|