iOS中判斷一個(gè)點(diǎn)是否命中到某扇形區(qū)域內(nèi)

/**

沒(méi)有方向的相對(duì)坐標(biāo)轉(zhuǎn)換惫恼,x庸汗、y軸的方向與原點(diǎn)相同

@param origin 坐標(biāo)系原點(diǎn)

@param point 需要轉(zhuǎn)換的點(diǎn)

@return 沒(méi)有方向的相對(duì)坐標(biāo)轉(zhuǎn)換嗜逻,x洞拨、y軸的方向與原點(diǎn)相同

*? ? Y

*? ? |

*? ? |? ? ? CY

*? ? |? ? ? |

*? ? |? ? ? |? ? .point

*? ? |? ? ? |

*? ? |? ? ? |

*? ? |? origin----------------- CX

*? ? |

*? ? |

*? ? O--------------------------------------------------- X

*

*/

+ (CGPoint)absolute_to_relative:(CGPoint)origin point:(CGPoint)point {

return CGPointMake(point.x-origin.x, point.y-origin.y);

}

/**

簡(jiǎn)單極坐標(biāo)轉(zhuǎn)換(轉(zhuǎn)換后的x為斜邊养铸,y為角度),

減少數(shù)學(xué)函數(shù)調(diào)用(可以忽略舰攒,因?yàn)橥ǔG闆r下這幾種情況命中概率極低)

@param point 需要轉(zhuǎn)換的點(diǎn)

@return 簡(jiǎn)單極坐標(biāo)轉(zhuǎn)換(轉(zhuǎn)換后的x為斜邊,y為角度)悔醋,

減少數(shù)學(xué)函數(shù)調(diào)用(可以忽略摩窃,因?yàn)橥ǔG闆r下這幾種情況命中概率極低)

*/

+ (CGPoint)to_spolar_coordinate:(CGPoint)point {

CGPoint result;

result.x = 0;

result.y = -1;

if (0 == point.x == point.y) {

result.y = 0;

return result;

}

if (0 == point.y) {

result.x = point.x;

result.y = point.x > 0 ? 0 : 180;

return result;

}

if (0 == point.x) {

result.x = point.y;

result.y = point.y > 0 ? 90 : 270;

return result;

}

if (fabs(point.x) == fabs(point.y)) {

result.x = 1.41421 * fabs(point.x);

if (point.x > 0 && point.y > 0) {

result.y = 45;

} else if (point.x < 0 && point.y > 0) {

result.y = 135;

} else if (point.x < 0 && point.y < 0) {

result.y = 225;

} else if (point.x > 0 && point.y < 0) {

result.y = 315;

}

}

return result;

}

/**

轉(zhuǎn)換為極坐標(biāo)(轉(zhuǎn)換后的x為斜邊,y為角度)

@param point 需要轉(zhuǎn)換的點(diǎn)

@return 轉(zhuǎn)換為極坐標(biāo)(轉(zhuǎn)換后的x為斜邊芬骄,y為角度)

*/

+ (CGPoint)to_polar_coordinate:(CGPoint)point {

CGPoint result;

result.x = sqrt(point.x * point.x + point.y * point.y);

result.y = (180.0 / M_PI) * atan2(point.y , point.x); //弧度轉(zhuǎn)角度

result.y = result.y < .0 ? result.y + 360.0 : result.y;

return result;

}

/**

判斷一個(gè)點(diǎn)是否在扇形內(nèi)(相對(duì)中心點(diǎn))

@param center? 扇形的中心點(diǎn)

@param direction 中心線的方向坐標(biāo)

@param r 半徑

@param angle 角度(0 < angle < 360)

@param point 需要檢查的點(diǎn)

@return 判斷一個(gè)點(diǎn)是否在扇形內(nèi)(相對(duì)中心點(diǎn))

*/

+ (BOOL)in_circular_sector:(CGPoint)center direction:(CGPoint)direction r:(double)r angle:(float)angle point:(CGPoint)point {

//實(shí)際使用中猾愿,我們會(huì)把方向點(diǎn)的極坐標(biāo)放到外部進(jìn)行計(jì)算

CGPoint d_rpoint = [AlgorithmSystem absolute_to_relative:center point:direction]; //方向相對(duì)坐標(biāo)

CGPoint d_pc_point = [AlgorithmSystem to_spolar_coordinate:d_rpoint]; //方向極坐標(biāo)

if (-1 == d_pc_point.y) { //簡(jiǎn)單的如果轉(zhuǎn)換不出,則需要調(diào)用角度函數(shù)計(jì)算

d_pc_point = [AlgorithmSystem to_polar_coordinate:d_rpoint];

}

CGPoint rpoint = [AlgorithmSystem absolute_to_relative:center point:point]; //目標(biāo)相對(duì)坐標(biāo)

CGPoint pc_point = [AlgorithmSystem to_polar_coordinate:rpoint]; //目標(biāo)極坐標(biāo)

if (pc_point.x > r) return false;

bool result = false;

float half_angle = angle / 2;

float angle_counter = d_pc_point.y - half_angle; //中心線順時(shí)針?lè)较虻姆秶?/p>

float angle_clockwise = d_pc_point.y + half_angle; //中心線逆時(shí)針?lè)较虻姆秶?/p>

if (0 == d_pc_point.y || angle_counter < 0 || angle_clockwise > 360) {

angle_counter = angle_counter < 0 ? angle_counter + 360 : angle_counter;

angle_clockwise = angle_clockwise > 360 ? angle_counter - 360 : angle_counter;

if (pc_point.y >= 0 && pc_point.y <= angle_counter) {

result = true;

} else if (pc_point.y >= angle_clockwise && pc_point.y <= 360) {

result = true;

}

} else {

result = angle_counter <= pc_point.y && angle_clockwise >= pc_point.y;

}

return result;

}

將這三個(gè)方法添加到.m文件中調(diào)用+ (BOOL)in_circular_sector:(CGPoint)center direction:(CGPoint)direction r:(double)r angle:(float)angle point:(CGPoint)point 即可判斷

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末账阻,一起剝皮案震驚了整個(gè)濱河市蒂秘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌淘太,老刑警劉巖姻僧,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蒲牧,居然都是意外死亡撇贺,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)冰抢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)显熏,“玉大人,你說(shuō)我怎么就攤上這事晒屎〈。” “怎么了缓升?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蕴轨。 經(jīng)常有香客問(wèn)我港谊,道長(zhǎng),這世上最難降的妖魔是什么橙弱? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任歧寺,我火速辦了婚禮,結(jié)果婚禮上棘脐,老公的妹妹穿的比我還像新娘斜筐。我一直安慰自己,他們只是感情好蛀缝,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布顷链。 她就那樣靜靜地躺著,像睡著了一般屈梁。 火紅的嫁衣襯著肌膚如雪嗤练。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天在讶,我揣著相機(jī)與錄音液斜,去河邊找鬼翔横。 笑死围橡,一個(gè)胖子當(dāng)著我的面吹牛熬芜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播曙强,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蝗碎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了旗扑?” 一聲冷哼從身側(cè)響起蹦骑,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎臀防,沒(méi)想到半個(gè)月后眠菇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袱衷,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年捎废,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片致燥。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡登疗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辐益,我是刑警寧澤断傲,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站智政,受9級(jí)特大地震影響认罩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜续捂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一垦垂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧牙瓢,春花似錦劫拗、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至聂渊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間四瘫,已是汗流浹背汉嗽。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留找蜜,地道東北人饼暑。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像洗做,于是被迫代替她去往敵國(guó)和親弓叛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)诚纸。 張土汪:刷leetcod...
    土汪閱讀 12,737評(píng)論 0 33
  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile麗語(yǔ)閱讀 3,828評(píng)論 0 6
  • #define kBlackColor [UIColor blackColor] //.h //劃線 + (voi...
    CHADHEA閱讀 788評(píng)論 0 1
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理撰筷,服務(wù)發(fā)現(xiàn),斷路器畦徘,智...
    卡卡羅2017閱讀 134,628評(píng)論 18 139
  • 8月的時(shí)候接了兩個(gè)單子毕籽,一個(gè)是論文, 焦慮 抓心撓肝 的焦慮 到了九月 開(kāi)端就背黑鍋井辆,偏偏自己也留下記性不好的石錘...
    阿西_8ac3閱讀 190評(píng)論 0 0