2011-11-25 63 views
3

我正在寫一個WPF中的應用程序,並且遇到了一個問題。如下圖所示,我需要一種算法來確定指定點P是否位於圓圈的陰影區域內。陰影區域只是具有方向(陰影區域正在查看的位置)和角度的圓的一部分。點內餡餅

Pie Piece

+0

起初,我想出了一個類似的解決方案爲答案,但是我必須理解如何,因爲他們去解決這個角度問題從0到360然後環繞。現在正在工作。 – Dave

回答

4

數學第一:

令V = P - Ç 設U =(1,0):用以上

所示的幾何檢查| v | <ř

角度= ACOS(v.u/| V |)

檢查的角度是在範圍內。

在WPF:

Vector v = p - (new Point(0,0)); 
if(v.Length > radius) 
    return false; 
double angle = -Vector.AngleBetween(v, new Vector(1,0)); 
... 

下面是一個未經測試的類

class Pie 
{ 
    public Point Center { get; set; } 
    public double Radius { get; set; } 
    public Vector ZeroDegrees { get; set; } 
    public bool ClockwisePositive { get; set; } 

    public double GetAngle(Point p) 
    { 
     if (ClockwisePositive) 
      return (Vector.AngleBetween(p - Center, ZeroDegrees) + 360) % 360; 
     else 
      return (Vector.AngleBetween(ZeroDegrees, p - Center) + 360) % 360; 
    } 

    public bool Contains(Point p) 
    { 
     return (p - Center).Length <= Radius; 
    } 

    public class Slice 
    { 
     public Pie Parent { get; set; } 
     public double DirectionDegrees { get; set; } 
     public double SizeDegrees { get; set; } 

     public bool Contains(Point p) 
     { 
      if (!Parent.Contains(p)) 
       return false; 

      double angle = Parent.GetAngle(p); 
      double minAngle = (DirectionDegrees - SizeDegrees/2 + 360) % 360; 
      double maxAngle = (DirectionDegrees + SizeDegrees/2 + 360) % 360; 

      if (minAngle < maxAngle) 
       return minAngle <= angle && angle <= maxAngle; 
      else 
       return angle >= minAngle || angle <= maxAngle; 
     } 
    } 
} 
+0

非常優雅的解決方案,謝謝! – Dave

0

假設你首先測試的是P是圈子裏面,和你知道的餅塊

一個開始和結束的角度。找到線段CP(CPa)的方向 - 這應該是相當基本的觸發器

b。檢查是否CPA是開始和結束角度之間的餅塊