POV-Ray : Newsgroups : povray.general : How to check if three points are in line? Server Time20 Jun 2024 21:20:21 EDT (-0400)
 How to check if three points are in line? (Message 1 to 10 of 10)
 From: Kima Subject: How to check if three points are in line? Date: 5 Jun 2020 14:55:01 Message:
```
{
"@context": "https://schema.org",
"@type": "DiscussionForumPosting",
"headline": "How to check if three points are in line?",
"dateCreated": "2020-06-05T18:55:01+00:00",
"datePublished": "2020-06-05T18:55:01+00:00",
"author": {
"@type": "Person",
"name": "Kima"
}
}
I try to create a tube by connecting cylinders over a spline. To avoid
unnecessary elements, I want to check if three points in line to avoid creation
of two cylinders when one is sufficient.

To do this, I need to calculate the normalized vector of P2-P1 and compare it
with that of P3-P3 using the functions given at
https://www.povray.org/documentation/view/3.6.1/459/

What is the most efficient way, as it is a continuous calculation, which may
enable me to increase the resolution (number of points).
```
 From: Kima Subject: Re: How to check if three points are in line? Date: 5 Jun 2020 16:45:01 Message:
```
{
"@context": "https://schema.org",
"@type": "DiscussionForumPosting",
"headline": "Re: How to check if three points are in line?",
"dateCreated": "2020-06-05T20:45:01+00:00",
"datePublished": "2020-06-05T20:45:01+00:00",
"author": {
"@type": "Person",
"name": "Kima"
}
}
"Kima" <nomail@nomail> wrote:
> I try to create a tube by connecting cylinders over a spline. To avoid
> unnecessary elements, I want to check if three points in line to avoid creation
> of two cylinders when one is sufficient.
>
> To do this, I need to calculate the normalized vector of P2-P1 and compare it
> with that of P3-P3 using the functions given at
> https://www.povray.org/documentation/view/3.6.1/459/
>
> What is the most efficient way, as it is a continuous calculation, which may
> enable me to increase the resolution (number of points).

I forgot to add that I do this VAngle(V1, V2). My question was mostly about the
general idea. If it is feasible or I've missed an emerging issue since I have
not seen such an approach in the tutorials.
```
 From: Bald Eagle Subject: Re: How to check if three points are in line? Date: 5 Jun 2020 17:45:05 Message:
```
{
"@context": "https://schema.org",
"@type": "DiscussionForumPosting",
"@id": "#web.5edabc82e3705a85fb0b41570%40news.povray.org",
"headline": "Re: How to check if three points are in line?",
"dateCreated": "2020-06-05T21:45:05+00:00",
"datePublished": "2020-06-05T21:45:05+00:00",
"author": {
"@type": "Person",
"name": "Bald Eagle"
}
}
I'd say try utilizing this:
https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line#Line_defined_by_two_points

and checking if it's <= some small value (0.000001)

Otherwise maybe investigate what they have in the Graphics Gems series.

Did you see:

http://news.povray.org/povray.general/message/%3Cweb.5e97c81e9447013fb0b41570%40news.povray.org%3E/#%3Cweb.5e97c81e9447
013fb0b41570%40news.povray.org%3E

http://news.povray.org/povray.binaries.images/message/%3Cweb.5e97c744fd34edcfb0b41570%40news.povray.org%3E/#%3Cweb.5e97
c744fd34edcfb0b41570%40news.povray.org%3E

?
```
 From: Kima Subject: Re: How to check if three points are in line? Date: 5 Jun 2020 18:05:01 Message:
```
{
"@context": "https://schema.org",
"@type": "DiscussionForumPosting",
"headline": "Re: How to check if three points are in line?",
"dateCreated": "2020-06-05T22:05:01+00:00",
"datePublished": "2020-06-05T22:05:01+00:00",
"author": {
"@type": "Person",
"name": "Kima"
}
}
"Bald Eagle" <cre### [at] netscapenet> wrote:

> Did you see:
>
>
http://news.povray.org/povray.general/message/%3Cweb.5e97c81e9447013fb0b41570%40news.povray.org%3E/#%3Cweb.5e97c81e94
47
> 013fb0b41570%40news.povray.org%3E
>
>
http://news.povray.org/povray.binaries.images/message/%3Cweb.5e97c744fd34edcfb0b41570%40news.povray.org%3E/#%3Cweb.5e
97
> c744fd34edcfb0b41570%40news.povray.org%3E
>
> ?

NO! How did I miss it? I re-checked the curved prism thread, but still, I
couldn't find it.

How did you make it? I am very much interested in any alteration of prism :)
```
 From: Bald Eagle Subject: Re: How to check if three points are in line? Date: 5 Jun 2020 19:55:00 Message:
```
{
"@context": "https://schema.org",
"@type": "DiscussionForumPosting",
"headline": "Re: How to check if three points are in line?",
"dateCreated": "2020-06-05T23:55:00+00:00",
"datePublished": "2020-06-05T23:55:00+00:00",
"author": {
"@type": "Person",
"name": "Bald Eagle"
}
}
"Kima" <nomail@nomail> wrote:

> NO! How did I miss it? I re-checked the curved prism thread, but still, I
> couldn't find it.
>
> How did you make it? I am very much interested in any alteration of prism :)

You should visit more and post some renders of your work(s) in progress and
completed projects.

;)     ;)     ;)     ;)     ;)     ;)     ;)     ;)     ;)     ;)     ;)     ;)

It's a prism topped with an isosurface that blends from a polygon function to a
sphere over a range in y.

It took forever to get it right, and it's not exactly generally applicable.

But that's the kind of shape you were looking for, right?
```
 From: Tor Olav Kristensen Subject: Re: How to check if three points are in line? Date: 5 Jun 2020 23:15:00 Message:
```
{
"@context": "https://schema.org",
"@type": "DiscussionForumPosting",
"@id": "#web.5edb0964e3705a856d7cc5a50%40news.povray.org",
"headline": "Re: How to check if three points are in line?",
"dateCreated": "2020-06-06T03:15:00+00:00",
"datePublished": "2020-06-06T03:15:00+00:00",
"author": {
"@type": "Person",
"name": "Tor Olav Kristensen"
}
}
"Kima" <nomail@nomail> wrote:
> I try to create a tube by connecting cylinders over a spline. To avoid
> unnecessary elements, I want to check if three points in line to avoid creation
> of two cylinders when one is sufficient.
>
> To do this, I need to calculate the normalized vector of P2-P1 and compare it
> with that of P3-P3 using the functions given at
> https://www.povray.org/documentation/view/3.6.1/459/
>
> What is the most efficient way, as it is a continuous calculation, which may
> enable me to increase the resolution (number of points).

You can do it like this:

#declare Nil = 1e-5; // Some small number

#declare p1 = <2, -3, 1>;
#declare p2 = <-3, 4, -2>;
#declare p3 = <5, 0, -3>;
// #declare p3 = (p1 + p2)/2;

#declare vC = vcross(p2 - p1, p3 - p1);

Now if vlength(vC) <= Nil, then the points are in line or almost in line.

--
Tor Olav
http://subcube.com
https://github.com/t-o-k/
```
 From: kurtz le pirate Subject: Re: How to check if three points are in line? Date: 6 Jun 2020 04:03:41 Message: <5edb4ddd\$1@news.povray.org>
```
{
"@context": "https://schema.org",
"@type": "DiscussionForumPosting",
"@id": "#5edb4ddd%241%40news.povray.org",
"headline": "Re: How to check if three points are in line?",
"dateCreated": "2020-06-06T08:03:41+00:00",
"datePublished": "2020-06-06T08:03:41+00:00",
"author": {
"@type": "Person",
"name": "kurtz le pirate"
}
}
On 06/06/2020 05:12, Tor Olav Kristensen wrote:

> #declare vC = vcross(p2 - p1, p3 - p1);
>
>
> Now if vlength(vC) <= Nil, then the points are in line or almost in line.

Wholeheartedly agree.
If cross product of two vectors is null, the points are aligned.
Just be careful about 'null' value.

--
Kurtz le pirate
Compagnie de la Banquise
```
 From: Kima Subject: Re: How to check if three points are in line? Date: 6 Jun 2020 07:35:01 Message:
```
{
"@context": "https://schema.org",
"@type": "DiscussionForumPosting",
"headline": "Re: How to check if three points are in line?",
"dateCreated": "2020-06-06T11:35:01+00:00",
"datePublished": "2020-06-06T11:35:01+00:00",
"author": {
"@type": "Person",
"name": "Kima"
}
}
"Bald Eagle" <cre### [at] netscapenet> wrote:
> "Kima" <nomail@nomail> wrote:
>
> > NO! How did I miss it? I re-checked the curved prism thread, but still, I
> > couldn't find it.
> >
> > How did you make it? I am very much interested in any alteration of prism :)
>
> You should visit more and post some renders of your work(s) in progress and
> completed projects.
>
> ;)     ;)     ;)     ;)     ;)     ;)     ;)     ;)     ;)     ;)     ;)     ;)
>
>
>
> It's a prism topped with an isosurface that blends from a polygon function to a
> sphere over a range in y.
>
> It took forever to get it right, and it's not exactly generally applicable.
>
> But that's the kind of shape you were looking for, right?

You're right, I should come more often, as subtle tricks are introduced here.

My projects are more for fun as a hobby. Thus, there is no straight line to
measure progress. So, I easily give up an idea and try another; but I frequently
check for emerging solutions for my older ideas :)

isosurface is very flexible, but I was unable to find a pragmatic way to match
it with prism. Theoretically, it is possible, as the points and curves of the
prim can be easily calculated through the underlying spline. Unless the prism
shape is geometrical to find a matching isosurface function.
```
 From: Kima Subject: Re: How to check if three points are in line? Date: 6 Jun 2020 08:25:01 Message:
```
{
"@context": "https://schema.org",
"@type": "DiscussionForumPosting",
"headline": "Re: How to check if three points are in line?",
"dateCreated": "2020-06-06T12:25:01+00:00",
"datePublished": "2020-06-06T12:25:01+00:00",
"author": {
"@type": "Person",
"name": "Kima"
}
}
"Tor Olav Kristensen" <tor### [at] TOBEREMOVEDgmailcom> wrote:
> "Kima" <nomail@nomail> wrote:
> > I try to create a tube by connecting cylinders over a spline. To avoid
> > unnecessary elements, I want to check if three points in line to avoid creation
> > of two cylinders when one is sufficient.
> >
> > To do this, I need to calculate the normalized vector of P2-P1 and compare it
> > with that of P3-P3 using the functions given at
> > https://www.povray.org/documentation/view/3.6.1/459/
> >
> > What is the most efficient way, as it is a continuous calculation, which may
> > enable me to increase the resolution (number of points).
>
> You can do it like this:
>
>
> #declare Nil = 1e-5; // Some small number
>
> #declare p1 = <2, -3, 1>;
> #declare p2 = <-3, 4, -2>;
> #declare p3 = <5, 0, -3>;
> // #declare p3 = (p1 + p2)/2;
>
> #declare vC = vcross(p2 - p1, p3 - p1);
>
>
> Now if vlength(vC) <= Nil, then the points are in line or almost in line.
>
> --
> Tor Olav
> http://subcube.com
> https://github.com/t-o-k/

I first went for calculating vlength because it is straightforward. I then tried
the angle between two vectors since I could set a degree of deviation.

By the way, your artworks are amazing. I am playing with your python notebooks.
```
 From: Tor Olav Kristensen Subject: Re: How to check if three points are in line? Date: 8 Jun 2020 11:35:01 Message:
```
{
"@context": "https://schema.org",
"@type": "DiscussionForumPosting",
"@id": "#web.5ede59dfe3705a854bb18d5a0%40news.povray.org",
"headline": "Re: How to check if three points are in line?",
"dateCreated": "2020-06-08T15:35:01+00:00",
"datePublished": "2020-06-08T15:35:01+00:00",
"author": {
"@type": "Person",
"name": "Tor Olav Kristensen"
}
}
"Kima" <nomail@nomail> wrote:
> "Tor Olav Kristensen" <tor### [at] TOBEREMOVEDgmailcom> wrote:
> > "Kima" <nomail@nomail> wrote:
> > > I try to create a tube by connecting cylinders over a spline. To avoid
> > > unnecessary elements, I want to check if three points in line to avoid creation
> > > of two cylinders when one is sufficient.
> > >
> > > To do this, I need to calculate the normalized vector of P2-P1 and compare it
> > > with that of P3-P3 using the functions given at
> > > https://www.povray.org/documentation/view/3.6.1/459/
> > >
> > > What is the most efficient way, as it is a continuous calculation, which may
> > > enable me to increase the resolution (number of points).
> >
> > You can do it like this:
> >
> >
> > #declare Nil = 1e-5; // Some small number
> >
> > #declare p1 = <2, -3, 1>;
> > #declare p2 = <-3, 4, -2>;
> > #declare p3 = <5, 0, -3>;
> > // #declare p3 = (p1 + p2)/2;
> >
> > #declare vC = vcross(p2 - p1, p3 - p1);
> >
> >
> > Now if vlength(vC) <= Nil, then the points are in line or almost in line.
> >...

> I first went for calculating vlength because it is straightforward. I then tried
> the angle between two vectors since I could set a degree of deviation.
>
> By the way, your artworks are amazing. I am playing with your python notebooks.

Thank you Kima.

I find Python much more powerful than the POV-Ray SDL when it comes to writing
code for 3D-calculations. It's a pity that the 3D rendering process is much more
involved in Python.

If p1 is "the middle" point of p1, p2 and p3 - and you have decided on a fixed
acceptable maximum angle (for using p1), then you can do this:

#declare Angle = radians(179); // Maximum angle (between 0 and Pi)
#declare Cos = cos(Angle);
// The two calculations above should only be done once.

#declare Dot = vdot(vnormalize(p2 - p1), vnormalize(p3 - p1));

#if (Dot < Cos)
// Do not use p1
#end // if

I also suggest that you write your code so that you don't have to normalize both
the two possible vectors between each pair of points as you traverse the points
on the spline.

For example, if these are points along your spline:
pA, pB, pC, pD, pE, ...

Then:
vnormalize(pB - pC) = -vnormalize(pC - pB)
vnormalize(pC - pD) = -vnormalize(pD - pC)
vnormalize(pD - pE) = -vnormalize(pE - pD)
....

--
Tor Olav
http://subcube.com
https://github.com/t-o-k
```