NTNUJAVA Virtual Physics LaboratoryEnjoy the fun of physics with simulations! Backup site http://enjoy.phy.ntnu.edu.tw/ntnujava/
October 21, 2020, 06:20:35 am

Last chance is the best chance. ...Wisdom

 Pages: [1]   Go Down
 Author Topic: how to detect a point is inside an area that is rotatable by cta ?  (Read 5569 times) 0 Members and 1 Guest are viewing this topic. Click to toggle author information(expand message area).
lookang
Hero Member

Offline

Posts: 1796

http://weelookang.blogspot.com

 « Embed this message on: April 22, 2010, 04:40:39 pm » posted from:SINGAPORE,SINGAPORE,SINGAPORE

Hi everyone,

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

Code:
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

 areadetectionwithrotation.PNG (17.42 KB, 863x532 - viewed 398 times.) *** There are 1 more attached files. You need to login to acces it! « Last Edit: April 22, 2010, 04:47:27 pm by lookang » Logged
Fu-Kwun Hwang
Hero Member

Offline

Posts: 3086

 « Embed this message Reply #1 on: April 22, 2010, 05:23:47 pm » posted from:Taipei,T'ai-pei,Taiwan

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, $y is at left side of L1
Another 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 ).
 Logged
lookang
Hero Member

Offline

Posts: 1796

http://weelookang.blogspot.com

 « Embed this message Reply #2 on: April 22, 2010, 10:25:02 pm » posted from:Singapore,,Singapore

u r a genius!
thanks!
i used method one
Code:
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. alright man super!!

crap, introduce some other bugs, gotta look at it closer again haiz
 « Last Edit: April 22, 2010, 10:32:02 pm by lookang » Logged
 Pages: [1]   Go Up
Last chance is the best chance. ...Wisdom