Author Topic: how to detect a point is inside an area that is rotatable by cta ?  (Read 5810 times)

lookang

  • Hero Member
  • *****
  • Posts: 1772
  • http://weelookang.blogspot.com
    • lookang web
Hi everyone,

i am able to detect xCompass,yCompass inside the rectangle area with centre xMagnet,yMagnet with sizex = Magnetsizex and sizey=Magnetsizey.

if ( xCompass<(xMagnet+Magnetsizex/2) && xCompass>(xMagnet-(Magnetsizex/2) && yCompass<(yMagnet+Magnetsizey/2) && yCompass>(yMagnet-Magnetsizey/2))
{
test = true; // way to tell it is doing this
b[0] = 225;
b[1] = 225;
}


but when the rectangle area is rotatable by angle cta, i seems to be stuck trying to make the code detect the inside of the area rectangle.

i tried it & probably it has something to do with transformation of the axes,
but it feels rather long in the code


is there a way to do it elegantly? hmmmmmm
 
« Last Edit: April 22, 2010, 05:47:27 pm by lookang »

Fu-Kwun Hwang

  • Administrator
  • Hero Member
  • *****
  • Posts: 3062
    • Enjoy the fun of physics with simulations
Re: how to detect a point is inside an area that is rotatable by cta ?
« Reply #1 on: April 22, 2010, 06:23:47 pm »
There are at least two ways to do it.
1. Rotate the coordinate system so (x,y) become (x',y'), so it become zero degree again.
And check it by the same method.

2. if the coordinates for those four points are (x1,y1), (x2,y2), (x3,y3) and (x4,y4).
Assume a line L1: $y=m_1 x+b_1$ pass (x1,y1) and (x2,y2). Then $y>m_1a+b_1$ is at the right side of the L1, $yAnother line L2: $y=m_2 x+b_2$ pass (x3,y3) and (x4,y4).

If the compass is inside, it must be between L1 and L2.
So you can find out condition (1) : $(y-m_1 x-b_1)(y-m_2 x-b_2)<0 $

There are another two lines
L3 :pass (x1,y1) , (x4,y4)
L4: pass (x2,y2) , (x3,y3)
So you can find out another condition (2): $(y-m_3 x-b_3)(y-m_4 x-b_4)<0$

The compass is inside if the above two conditions are satisfied at the same time (use and operator ).

lookang

  • Hero Member
  • *****
  • Posts: 1772
  • http://weelookang.blogspot.com
    • lookang web
Re: how to detect a point is inside an area that is rotatable by cta ?
« Reply #2 on: April 22, 2010, 11:25:02 pm »
u r a genius!
thanks!
i used method one
xMagnettransform = xMagnet*cs+yMagnet*sc;
yMagnettransform = -xMagnet*sc+yMagnet*cs;
xCompasstransform = xCompass*cs+yCompass*sc;
yCompasstransform = -xCompass*sc+yCompass*cs;



if ( magnetNS==false&&xCompasstransform<(xMagnettransform+Magnetsizex/2) && xCompasstransform>(xMagnettransform-(Magnetsizex/2)) && yCompasstransform<(yMagnettransform+Magnetsizey/2) && yCompasstransform>(yMagnettransform-Magnetsizey/2))
{
test = true;
b[0] = (225*cs)*vectorfieldmaxopposite/100;
b[1] = (225*sc)*vectorfieldmaxopposite/100;
}
it works so beautifully now. ;D alright man super!!

crap, introduce some other bugs, gotta look at it closer again haiz
« Last Edit: April 22, 2010, 11:32:02 pm by lookang »