|
Hiya guys.. Using C++ does anyone know how i can tell if a line is linear or not? I want the user to enter 5 readings which i can plot on a chart. However i would like a function to find out if the plotted line is linear.
Any help would be greatly appreciated!
|
|
|
|
|
EDIT: Not sure if this is needed or not: if the slope between x_1,y_1 and x_5,y_5 is greater than 1, swap the x and y values for each coordinate pair. This swap is needed to keep the delta value in the next step smaller than 1.
Create a function for the line y = f(x) using points 1 and 5. Then of each of the 3 points in the middle calculate f(x_n), if ABS(f(x_n) - y_n) < 1, then x_n,y_n is on on the line (give or take the rounding error from forcing integral values).
--
You have to explain to them [VB coders] what you mean by "typed". their first response is likely to be something like, "Of course my code is typed. Do you think i magically project it onto the screen with the power of my mind?" --- John Simmons / outlaw programmer
|
|
|
|
|
Hi Dan,
Same idea, but without any math showing, the lazy approach:
- Create a GraphicsPath
- add the line connecting the end points
- widen with a pen (I guess width=3, more gives more tolerance)
- check all points fall within (that's GraphicsPath.IsVisible)
|
|
|
|
|
Hiya Luc. Thanks also for your reply. This is an interesting approach here, however GraphicsPath is a .net class while i am using native C++/MFC.
|
|
|
|
|
Cheers Dan. This is great..
Im just a little confused about the functions f(x) and f(x_n). What is the body of these functions?
|
|
|
|
|
The same function, f(x) is the generic function, x_n is x_1, x_2,... (the x points of your test coordinates). Probably best done using the slope-intercept form. Google if you need help getting the values from two points.
--
You have to explain to them [VB coders] what you mean by "typed". their first response is likely to be something like, "Of course my code is typed. Do you think i magically project it onto the screen with the power of my mind?" --- John Simmons / outlaw programmer
|
|
|
|
|
ahh-ahhh..... the penny has dropped. Thanks again.
|
|
|
|
|
Try to apply Linear Regression to your points.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
Hi CPallini,
it depends on what the points represent:
- for ideal (x,y) points, yes
- for graphic approximation (such as Bresenham), not so good
Greetings
|
|
|
|
|
It appears to me like a mathematical problem rather than a (digital) graphics one. Anyway, only the OP can clarify the point (I hope!)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
|
|
|
|
|
hi flippydeflippydebop
"entering 5 readings" u mean input 5 values then in each reading u will get a point's value mean(x,y)
it means
int x[5], y[5]
for( i=0; i<5; i++ )
read x[i], y[i]
resultX = x[0] - x[1] - x[2] - x[3] - x[4]
resultY = y[0] - y[1] - y[2] - y[3] - y[4]
if( ( resultX == 0 ) and ( resultY == 0 ) )
print "line is linear"
else
print "line is not linear"
i think this is the solution if it is true plz inform me if it is wrong then also inform me plz..
in case it is true u can further enhance and can be maked easy and powerful then this.
plz inform me about its correctness
habib bhutto
|
|
|
|
|
hi flippydeflippydebop
"entering 5 readings" u mean input 5 values then in each reading u will get a point's value mean(x,y)
it means
int x[5], y[5]
for( i=0; i<5; i++ )
read x[i], y[i]
resultX = x[0] - x[1] - x[2] - x[3] - x[4]
resultY = y[0] - y[1] - y[2] - y[3] - y[4]
if( ( resultX == 0 ) and ( resultY == 0 ) )
print "line is linear"
else
print "line is not linear"
i think this is the solution if it is true plz inform me if it is wrong then also inform me plz..
in case it is true u can further enhance and can be maked easy and powerful then this.
plz inform me about its correctness
habib bhutto
|
|
|
|
|
won't work.
points 10,10 11,11 12,12 13,13 14,14. Obviously linear, but resultx and resulty are both -50.
--
You have to explain to them [VB coders] what you mean by "typed". their first response is likely to be something like, "Of course my code is typed. Do you think i magically project it onto the screen with the power of my mind?" --- John Simmons / outlaw programmer
|
|
|
|
|
To understand if a line is 'approzimately' a line you can use the Hough transform .
Hope helps
Russell
|
|
|
|
|
|
You could use the equation of a line y=mx+c, we don't know the value of c (and we can't calculate it because the line might not be straight) but we can force it to be zero by shifting all the x,y coordinates by the same amount such that the first point is 0,0 now c=0 and we can calculate m for each point, m=y/x (except for the first point since this will result in divide by zero!)
If the line is straight then the value for m will be the same for each point. Should be relatively easy and quick to code...
Apathy Rules - I suppose...
|
|
|
|
|
hi..I'd like to ask if someone here know how can I convert 2dim.image to 3dim. image i.e.2d information to 3d information & how can I get patches of information for extraction images.In my project I use matlab.Thank you.
zz
|
|
|
|
|
Hi
Is it possible at all to convert 2d image data to 3d image data? In 2d image dat a you wont have the depth information, but for creating 3d image data you need depth information.
Regards
The Best Religion is Science.
Once you understand it, you will know God.
|
|
|
|
|
This one has me frustrated... What I need is a function that will give me the x and y coordinates of a point on a circle (defined by it's x and y coordinates and its width and height) when given a number in degrees. For example...
public Point GetPointOnCircle(int circleX, int circleY, int circleWidth, int circleHeight, int degrees) {
return new Point(x, y);
}
I've tried to figure it out on my own but it's proven to be a bit more complicated than I thought it would be. Could anyone help me out?
P.S. I'm using C#
-----
*** Never give me an answer having anything to do with Visual Studio. I don't have this because I have two computers, one being my dad's mac, which is connected to the internet, the other being my pc, which is, sadly, not connected to the internet. The setup for the Visual C# program I think is called a "bootstrap" program, and it needs to connect to the internet to install the program. THEREFORE I cannot install this program onto my pc.***
|
|
|
|
|
Hi Max,
for a real circle with origin (0,0) and radius 1 the coordinates of the point at angle alpha
are given by (cos(alpha), sin(alpha))
Sanity checks: alpha=0 ==> (1,0) alpha=90 ==> (0,1) alpha=180 ==> (-1,0)
multiply by r to enlarge the circle, and add (cx,cy) to translate it.
BTW I expect Math.Sin/Cos to accept radians, not degrees; so you need to convert that
probably based on Math.Pi
for an ellipse it is similar but slightly more complex, dont know by heart.
it is (cx+rx*cos(alpha), cy+ry*sin(alpha))
where rx and ry are the horizontal and vertical radii (that's for an orthogonal ellipse,
one that has its major axes parallel with the coordinate system's axes)
Sanity check: x must and will be in range (cx-rx,cx+rx) and y in range (cy-ry,cy+ry)
-- modified at 0:30 Saturday 21st July, 2007
|
|
|
|
|
Thanks a lot! That's pretty much exactly what I needed.
-----
*** Never give me an answer having anything to do with Visual Studio. I don't have this because I have two computers, one being my dad's mac, which is connected to the internet, the other being my pc, which is, sadly, not connected to the internet. The setup for the Visual C# program I think is called a "bootstrap" program, and it needs to connect to the internet to install the program. THEREFORE I cannot install this program onto my pc.***
|
|
|
|
|
You're welcome.
I am surprised though you asked this, it basically is the definition of cos() and sin(),
hence part of trigonometry 101, isnt it ?
|
|
|
|
|
Luc Pattyn wrote: I am surprised though you asked this, it basically is the definition of cos() and sin(),
hence part of trigonometry 101
I was curious as to why? Maybe he was just a little rusty on the Trig...
"The clue train passed his station without stopping." - John Simmons / outlaw programmer
|
|
|
|
|
Well, I dont expect any of the kids his age in my neighbourhood to ask this kind of question;
either they are not interested in programming, math and science, so they dont need it
and dont care to ask; or they are interested and hence they remember the definition and
the use of cos() and sin() they learned at school, and they are keen enough to figure
things out by themselves...
In the end, that's what schools are for: provide the basic information and the drive
to investigate and discover, isnt it ?
But then (this does not apply to Max, he asks lots of mostly good questions in diverse areas,
my comment was intended as an extra stimulus for him), I continuously am amazed by the number of
people lacking such drive : they ask basic questions on CP, often using the right keywords,
but "forget" to search the answers themselves; some of them, when they get a reply refering
to CP/MSDN/Google, see it fit to reply with "Can you provide a link ?".
|
|
|
|
|
I didn't realize the OP was only 14 years old until I looked at his profile. Trigonometry the Easy Way[^] is a great book I had when I was in high school back in the late '80s. I still have it and it is the second edition. It helped me with my grades.
"The clue train passed his station without stopping." - John Simmons / outlaw programmer
|
|
|
|