Started by Oct 04 2012 05:47 AM

,
3 replies to this topic

Posted 04 October 2012 - 05:47 AM

Here's a diagram beautifully depicting the problem.

Note: The pink line is the purple center line's radius length, not the black outer line's radius.

Note: The pink line is the purple center line's radius length, not the black outer line's radius.

Posted 04 October 2012 - 06:12 AM

Unfortunately, an image lacks formal rigor. What kind of intersection are you computing exactly? You have a 2D solid circle drawn in red, and a curve specified in pink? or a thick curve specified by the black outline? or a thick circle specified by the black area? or a hollow circle specified by the pink area? What is your input data? What is your expected output data?

I'm going to guess that you want to compute the point where a solid 2D circle (red) specified by A=(posA, rA) intersects a hollow 2D circle (pink) specified by B=(posB, rB):

If you instead are computing an intersection against a thick 2D "ring" formed by extruding the pink hollow circle by a distance d, do the same as above, but at step 3, do a if (distance < rA + d) instead.

I'm going to guess that you want to compute the point where a solid 2D circle (red) specified by A=(posA, rA) intersects a hollow 2D circle (pink) specified by B=(posB, rB):

1. Project posA to B. That is, compute projB = posB + (posA-posB).Normalized() * rB; 2. Compute the distance of projB to the circle A. distance = (posA - projB).Length(); 3. if (distance < rA) return intersection at point projB; else return no intersection;

If you instead are computing an intersection against a thick 2D "ring" formed by extruding the pink hollow circle by a distance d, do the same as above, but at step 3, do a if (distance < rA + d) instead.

Me+PC=clb.demon.fi | C++ Math and Geometry library: MathGeoLib, test it live! | C++ Game Networking: kNet | 2D Bin Packing: RectangleBinPack | Use gcc/clang/emcc from VS: vs-tool | Resume+Portfolio | gfxapi, test it live!

Posted 04 October 2012 - 06:14 AM

Do you want the point that is *Radius* units away from *Center* in the direction towards *Ball*? In that case, take the vector from *Center *to *Ball*, normalize it, multiply it by *Radius *and add it to *Center*.

Intersection = Center + Radius*normalize(Center-Ball)

Intersection = Center + Radius*normalize(Center-Ball)

Posted 04 October 2012 - 09:19 AM

Unfortunately, an image lacks formal rigor. What kind of intersection are you computing exactly? You have a 2D solid circle drawn in red, and a curve specified in pink? or a thick curve specified by the black outline? or a thick circle specified by the black area? or a hollow circle specified by the pink area? What is your input data? What is your expected output data?

Ah. I'm sorry for the image's vague description. I'll try answering the questions respective to the questions:

- The intersection where the blue line meets the pink line.
- A 2D solid circle in red is a ball, and a curve in pink is the center line, which is a line consisting of infinite center points of the black outline. The thick curve is the shape of an obstacle. It's not a thick circle, nor a hollow circle which was specified by the pink area.
- The input data for the ball consists of a vector position, vector speed, and vector acceleration. The obstacle (black lines) contains only the vector position of the center and the radius of the pink curve's distance.
- The expected output data would be to retrieve a vector point that is the intersection of the blue line and the pink curve.

I'm going to guess that you want to compute the point where a solid 2D circle (red) specified by A=(posA, rA) intersects a hollow 2D circle (pink) specified by B=(posB, rB):

1. Project posA to B. That is, compute projB = posB + (posA-posB).Normalized() * rB; 2. Compute the distance of projB to the circle A. distance = (posA - projB).Length(); 3. if (distance < rA) return intersection at point projB; else return no intersection;

If you instead are computing an intersection against a thick 2D "ring" formed by extruding the pink hollow circle by a distance d, do the same as above, but at step 3, do a if (distance < rA + d) instead.

I will take heed of your advice. Thanks.