2011-03-07 5 views
2

У меня есть многоугольник с некоторым радиусом. Что-то вроде this. Теперь мне нужноСоздать многоугольник с определенным радиусом

  • Вставить его в базу данных mysql.
  • найти, находится ли точка внутри или снаружи многоугольника. (Включает ли это получение вершин?)

Как это можно достичь?

+0

Что это нужно делать с PHP или MySQL? –

+0

Данные многоугольника должны храниться в базе данных mysql, и то же самое нужно получить с помощью php, чтобы получить вершины и найти, лежит ли внутри него точка. Я добавил больше подробностей к моему вопросу. –

+1

http://en.wikipedia.org/wiki/Point_in_polygon – Jacob

ответ

1

Finding, если точка лежит внутри многоугольника или нет, что будет сделано в обновлении

//this assumes that the orientation of your polygon is 
//http://en.wikipedia.org/wiki/File:Pentagon.svg 

$pass=1; 

function filter($init, $final, $center) 
{ 

    if(($final['a']['x']-$init['x'])*($center['y']-$init['y'])-($final['a']['y'] - $init['y'])*($center['x']-$init['x']) > 0) 
     return $final['a']; 
    else 
     return $final['b']; 
} 


function getNextPoint($init, $center, $distance, $slope) 
{ 
    global $pass; 

    $final['a']['x'] = $init['x']+$distance/sqrt(1+tan($slope)*tan($slope)); 
    $final['a']['y'] = $init['y']+(tan($slope)*$distance)/sqrt(1+tan($slope)*tan($slope)); 

    $final['b']['x'] = $init['x']-$distance/sqrt(1+tan($slope)*tan($slope)); 
    $final['b']['y'] = $init['y']-(tan($slope)*$distance)/sqrt(1+tan($slope)*tan($slope)); 


    echo "<br/><br/>"; 
    echo "Pass: $pass <br/>"; 
    echo "Slope: ".$slope."<br/>"; 


    if($pass == 1){ 
     $point = $final['b']; 
     $distance = $distance*2*sin(pi()/5); 
     $slope = 0; 
    } 
    else{ 
     $point = filter($init, $final, $center); 
     $slope = $slope+pi()/2.5; 
    }  
    echo "Position: "; 
    print_r($point); 
    echo "<br/>"; 

    echo "Distance : ".distance($init['x'], $init['y'], $point['x'], $point['y']); 


    if($pass == 7){ 
     return $point; 
    } 
    else{ 
     //echo "x: ".($point['x'])." y: ".($point['y'])." <br/>"; 
     $pass++; 

     getNextPoint($point, $center, $distance, $slope); 
    } 

    //echo "x: ".($point['x'])." y: ".($point['y'])." <br/>"; 
} 

function polygon($vertices=5, $centerX=10, $centerY=10, $radius=5) 
{ 

    $internalangle = ($vertices-2)*pi()/$vertices; 

    $slope = pi()+($internalangle)/2; 

    $init['x'] = 10; 
    $init['y'] = 10; 

    getNextPoint($init, $init, 5, $slope); 
} 



polygon(); 

/* 
function getx($slope, $x1, $y1, $y) 
{ 
    return (($y-$y1)/$slope+$x1); 
} 

function gety($slope, $x1, $y1, $x) 
{ 
    return ($slope*($x-$x1)+$y1); 
} 

*/ 

function distance($initx, $inity, $finalx, $finaly) 
{ 

    return sqrt(($initx-$finalx)*($initx-$finalx)+($inity-$finaly)*($inity-$finaly)); 

} 

function getslope($final, $init) 
{ 
    return atan(($final['y']-$init['y'])/($final['x']-$init['x']))*180/pi(); 
} 
+0

Это, кажется, хорошо работает с правильным многоугольником из 5 вершин (пятиугольник). Не пробовал еще с 4 или 6 вершинами. –

2

Для классификации очков требуется, чтобы многоугольник был полностью определен. Обычно вам нужно либо вершины по порядку вокруг многоугольника, либо некоторые ограничения, которые полностью определяют многоугольник (например: регулярный, центрированный в начале координат, с одной вершиной на оси + x и заданным числом сторон). Если многоугольник является самопересекающимся, вам также необходимо определить, что означает «внутри» и «снаружи» в этом случае (существует несколько неэквивалентных определений).

EDIT: Если вы Google «PHP многоугольник» вы найдете много кода для точки в многоугольнике тестирования (here, например, хотя я не ручаюсь за правильность этого кода).

+0

Спасибо, но я хочу знать, как я могу найти точку в полигоне, если я знаю только радиус многоугольника. Многоугольник центрирован в начале координат. –

+1

вы не можете - вам нужно иметь точки и линии полигонов – fazo

+1

Даже если многоугольник центрирован в начале координат и является регулярным многоугольником (все стороны и углы равны), этого недостаточно. Рассмотрим квадрат радиуса 1. Если диагонали выровнены с осями X и Y, то точка (.75, 0) находится внутри квадрата; если диагонали находятся под углом 45 градусов, то это не так. –

1
<?php 
function point_in_reg_poly($sides, $radius, $p_x, $p_y) { 
    $centerAngle = 2*pi()/$sides; 
    $internalRadius = $radius * sin($centerAngle/2); 

    $angle = atan2($p_x, $p_y); 
    $length = sqrt($p_x*$p_x + $p_y*$p_y); 

    if($length > $radius) 
     return false; 

    //normalize angle to angle from center of nearest segment 
    $angle = fmod($angle + 2*pi(), $centerAngle) - $centerAngle/2; 

    return $internalRadius > $length * cos($angle); 
} ?> 

Этот продукт работает. Но действительно, не могли бы вы заметить синтаксические ошибки!

+0

Извините, но я получил нулевое значение, когда пытался: ** echo point_in_reg_poly (4, 5, 10, 10); ** –

+0

Его было время от времени Я закодирован в PHP. Возможно, modulo '%' оператор недопустим для чисел с плавающей запятой. Скорее всего, PI не является определенной константой. Относитесь к этому как псевдокод php-esque – Eric

Смежные вопросы