|
You mean 5px above, and 5px below? Or 2.5px above and below?
Either way, you need to calculate the angle of the line, which basically is:
int lenX = startX-endX;
int lenY = startY-endY;
float length = sqrt(lenX^2 + lenY^2);
float angle = inverse cos(length/lenX)
Check up on google, there's lots of maths there.
My current favourite word is: Bauble!
-SK Genius
|
|
|
|
|
Thanks for the help, will give it a try. Something so simple, guess I was over engineering it!
Mike
Life is not measured by the number of breaths we take, but by the
moments that take our breath away. "George Carlin"
|
|
|
|
|
Hi Mike,
what you need is algebra, not geometry.
a straight line can be represented by a*x + b*y + c = 0
having two points (x1,y1) and (x2,y2) you can find a,b,c (except for an
arbitrary scale factor).
The orthogonal distance of an arbitrary point (x,y) to that same line is given
by a*x + b*y + c which is obviously zero for all points on the line.
So for hit testing I would:
- calculate a,b,c once
- checking a*x + b*y + c is sufficiently small
- for a finite line segment: also checking x is in an acceptable range
smallest of x1 and x2 minus some, largest of them plus some; same for y.
BTW: officially you should normalize the scale factor such that e.g.
a*a+b*b+c*c=1; in reality you can skip that and replace the distance check by:
(a*x + b*y + c)^2 small with respect to a*a+b*b+c*c
FYI: there is a completely different way to do all this:
create a memory-based bitmap where you draw the same line with a much thicker pen,
of a selected color; now just sample the color at (x,y) to see whether it is
part of the thick line. This also works for more complex shapes and drawings
provided you use different colors for different pickables (a problem will arise
where they overlap though).
|
|
|
|
|
Luc,
Thanks thats exactly what I needed. Had the slope, deltaX and deltaY and from that calculated the angle but got stuck there. I guess what I thought would be easiest would be to find the 4 points perpendicular to the line and just do a rectangle.contains(point).
Thanks,
Mike
Life is not measured by the number of breaths we take, but by the
moments that take our breath away. "George Carlin"
|
|
|
|
|
No, the sides of a rectangle are always parallel to the axis - but you can do something similiar with Path/Region - structures.
Let's say you've got the endpoints (x,y) and (x',y') of your line, then the vector perpendicular to this will be
(- y'+ y,x' - x). Normalize this with the reziprocal of the length: l = sqrt((x'-x)^2 + (y'-y)^2) and you get an
vektor (vx,vy) (vx = -(y'+y)/l, vy = (x'-x)/l),
now you add (d = desired width) d/2*n and -d/2*n to the endpoints to get 4 new points that define the outline of your shape (use a path with this 4 points to create a region).
Now you only have to add two circles with radius d/2 and centers of your original endpoints of the line to the region and you have a region describing the desired neighbourhood - and you can do Hittesting in it
|
|
|
|
|
CKnig,
Thanks, appreciate the help!
Mike
Life is not measured by the number of breaths we take, but by the
moments that take our breath away. "George Carlin"
|
|
|
|
|
Hi,
I have this formula -
Double i_decel_rate = ((Convert.ToInt32(textbox1.Text) * 10000) / Convert.ToInt32(textbox2.Text));
But for some reason the double doesn't display as double - like a value 7.98 is shown as 7 - it is not showing the decimals - but does display the integer value. I am using a text box to display this value - is there a way in webforms to print a value? Like the windows forms has messagebox.show()?
is anything off with the syntax?
thanks.
modified on Monday, December 10, 2007 8:41:47 AM
|
|
|
|
|
VK-Cadec wrote: is anything off with the syntax?
Yes, if you do division using integers the result is an integer (as you've found).
Double i_decel_rate = ((Convert.ToDouble(textbox1.Text) * 10000.0) / Convert.ToDouble(textbox2.Text));
|
|
|
|
|
Hi, iam doing windows application in c#
i have one textbox and datagridview control....
when i enter "productid" in textbox ,it can fetch the data from database
and displayed in datagridview..
when i enter another 'productid" in textbox ,it can also fetch and displayed in datagridview in second row....
i,e in datagrid both previous data results and recent data results are also
to be displayed ---
please give me solution...
murali krishna
|
|
|
|
|
Huh? Can you be a little more clear (not what you are trying to achieve, but how you are trying to achieve it)?
"The clue train passed his station without stopping." - John Simmons / outlaw programmer
"Real programmers just throw a bunch of 1s and 0s at the computer to see what sticks" - Pete O'Hanlon
|
|
|
|
|
hi
I have done a project in which i am connecting a application to a server the purpose is text transaction ....i have done it using threads ..............i want know is there any way to check how much resource is getting utilized
regards
sindhu tiwari
its me sid
|
|
|
|
|
Hi friends,
Thanks to those who answered my first question. Now I have other.
Do you think it is worth it to buy books for C# 2005 and .Net 2.0 when VS 2008 and .Net 3.0 are around the corner?
I'm afraid of buying those books, eat them and then, Microsoft changes the examinations to the latest technology.
What do you think?
I'm thinking in buying this pack:
http://www.amazon.com/gp/product/0470048409/ref=olp_product_details?ie=UTF8&me=&seller=[^]
|
|
|
|
|
Hi
the code below incrments by 1 each time and adds1 to the end number, is there a way for it to increment 01,02,03 rather then 1,2,3
string[] split = db.Split('_');
string s_number = split[1];
int i_number = Int32.Parse(s_number);
i_number++;
s_number = i_number.ToString();
db = split[0] + "_" + s_number;
cheers
|
|
|
|
|
You can use String.Format()[^]. You can find the right format string in the examples.
Standards are great! Everybody should have one!
|
|
|
|
|
1 is a number which you can increment.
01 is a string representation of a number. You cannot increment a string as it has no real meaning to do so.
You should increment you number (1) and then apply string formatting to that number (myNumber.ToString("00")) to get the required format.
|
|
|
|
|
Guess you missed my other reply
Yeah, either .Format("00");
or like i said last time .PadLeft(2, '0');
My current favourite word is: Bauble!
-SK Genius
|
|
|
|
|
ok so should it be added somewhere in the line below as this is the entire format of what is being outputted?
db = split[0] + "_" + s_number;
|
|
|
|
|
Instead of getting someone here to hold your hand all the way through... try some stuff out yourself next time given the hints that have been provided.
db = split[0] + "_" + s_number.ToString("00");
|
|
|
|
|
well done thats great thats what ive already tried which is why i posted the question
db = split[0] + "_" + s_number.ToString("00"); this does not work error message is there are invalid areguments in the code
|
|
|
|
|
it should be this:
s_number = i_number.ToString("00");
not
db = split[0] + "_" + s_number.ToString("00");
|
|
|
|
|
well done.
|
|
|
|
|
Hi,
I have a datatable which is going to fill from a if statment (I mean I don't know which record is going to returned) and after the data is returned i want to be able to edit or delete the returned records.
(the IF's are a search statment all on one table and diffrent columns)
so when S.O wants to delete a record i want to refresh the Grid which is filled with datatable.
how can i refresh the datatable.
(I hope i was able to express what I mean)
please help me.
|
|
|
|
|
I strongly advise to use SQL to get only the data you want.
If this is not possible you will have to use loop to step through all returned rows and fill a new DataTable with only the rows you want (ImportRow) (no a DataView won't help if you can't use SQL to filter).
If you may use LINQ it's getting simpler - just use where with your IF
(for example:
<br />
<br />
var FilteredDT = from c in originalTable<br />
where (c => (statements from the if for c - for example c.Name.StartsWith("x")))<br />
select c;<br />
<br />
|
|
|
|
|
I have the following code and one progress bar (websites are navigated at run time and web site list may be more than this)
<br />
for (int kk = 0; kk < 3; kk++)<br />
{<br />
web = new WebBrowser();<br />
web.Url = new System.Uri(websitelist[kk], System.UriKind.Absolute);<br />
web.Navigate(websitelist[kk]);<br />
hashTable.Add(kk, web);<br />
}
How can I get summation of progress of all webbrowsers in just a single progress bar i.e., their progress can be shown in single progress bar? If I am having a single webbrower I can get progress values by using their event handle, but when I have run time browers control and going on increasing how can I use event handling for all browsers(stored in hashtable as objects)
like :
foreach (int kk in hashTable.Keys)<br />
{ <br />
......<br />
...<br />
}
|
|
|
|
|
I don't think you can get the progress of the web control (no use anyway because if you set the URL or Navigate in a WebBrowser-Control the statement will only return after the site was loaded - so you would have to use a asynchron version).
Why don't you just use (kk+1.0)/websitelist.Count as a hint?
(If not you will have to load the sites yourself ... I don't think you will enjoy the work)
|
|
|
|