C and C++ Programming Resources

Custom Search

Graphics in C Language

Minimum Distance between a Point and a Line

This note describes the technique and gives the solution to finding the shortest distance from a point to a line or line segment. The equation of a line defined through two points P1 (x1,y1) and P2 (x2,y2) is

P = P1 + u (P2P1)

The point P3 (x3,y3) is closest to the line at the tangent to the line which passes through P3, that is, the dot product of the tangent and line is 0, thus

(P3P) dot (P2P1) = 0

Substituting the equation of the line gives

[P3 - P1 - u(P2 - P1)] dot (P2P1) = 0

Solving this gives the value of u

Substituting this into the equation of the line gives the point of intersection (x,y) of the tangent as

x = x1 + u (x2 – x1)
y = y1 + u (y2 – y1)

The distance therefore between the point P3 and the line is the distance between (x,y) above and P3.

Notes

  • The only special testing for a software implementation is to ensure that P1 and P2 are not coincident (denominator in the equation for u is 0)
  • If the distance of the point to a line segment is required then it is only necessary to test that u lies between 0 and 1.
  • The solution is similar in higher dimensions.

Source code

//================
//
// DistancePointLine Unit Test
// Copyright (c) 2002, All rights reserved
//
// Damian Coventry
// Tuesday, 16 July 2002
//
// Implementation of theory by Paul Bourke
//
//================
#include <stdio.h>
#include <math.h>
typedef struct tagXYZ
{
 float X, Y, Z;
}
XYZ;
float Magnitude( XYZ *Point1, XYZ *Point2 )
{
 XYZ Vector;
 Vector.X = Point2->X - Point1->X;
 Vector.Y = Point2->Y - Point1->Y;
 Vector.Z = Point2->Z - Point1->Z;
 return (float)sqrt( Vector.X * Vector.X + Vector.Y * Vector.Y + Vector.Z * Vector.Z );
}
int DistancePointLine( XYZ *Point, XYZ *LineStart, XYZ *LineEnd, float *Distance )
{
 float LineMag;
 float U;
 XYZ Intersection;
 LineMag = Magnitude( LineEnd, LineStart );
 U = ( ( ( Point->X - LineStart->X ) * ( LineEnd->X - LineStart->X ) ) +
 ( ( Point->Y - LineStart->Y ) * ( LineEnd->Y - LineStart->Y ) ) +
 ( ( Point->Z - LineStart->Z ) * ( LineEnd->Z - LineStart->Z ) ) ) /
 ( LineMag * LineMag );

 if( U < 0.0f || U > 1.0f )
 return 0; // closest point does not fall within the line segment
 Intersection.X = LineStart->X + U * ( LineEnd->X - LineStart->X );
 Intersection.Y = LineStart->Y + U * ( LineEnd->Y - LineStart->Y );
 Intersection.Z = LineStart->Z + U * ( LineEnd->Z - LineStart->Z );
 *Distance = Magnitude( Point, &Intersection );
 return 1;
}
void main( void )
{
 XYZ LineStart, LineEnd, Point;
 float Distance;
 LineStart.X = 50.0f; LineStart.Y = 80.0f; LineStart.Z = 300.0f;
 LineEnd.X = 50.0f; LineEnd.Y = -800.0f; LineEnd.Z = 1000.0f;
 Point.X = 20.0f; Point.Y = 1000.0f; Point.Z = 400.0f;
 if( DistancePointLine( &Point, &LineStart, &LineEnd, &Distance ) )
 printf( "closest point falls within line segment, distance = %f\n", Distance );
 else
 printf( "closest point does not fall within line segment\n" );
 LineStart.X = 0.0f; LineStart.Y = 0.0f; LineStart.Z = 50.0f;
 LineEnd.X = 0.0f; LineEnd.Y = 0.0f; LineEnd.Z = -50.0f;
 Point.X = 10.0f; Point.Y = 50.0f; Point.Z = 10.0f;
 if( DistancePointLine( &Point, &LineStart, &LineEnd, &Distance ) )
 printf( "closest point falls within line segment, distance = %f\n", Distance );
 else
 printf( "closest point does not fall within line segment\n" );
}

Pages: [Page - 1] [Page - 2] [Page - 3] [Page - 4]

Tags: , ,

There are 144 Comments to this post. You can follow any responses to this entry through the RSS 2.0 feed. You can skip to the end and leave a response or TrackBack from your own site.

  • Junjun says:

    I need to make a programming that works like a voting system…compute votes…and calculates score for finalist and display them in a data text file…using classes and object can anyone help me…

  • Ankit says:

    //This is a game cross and nought( Zero Katta) in c++.

    void show_game_box();
    char m[3][3];
    void main()
    {
    int p,q;
    char ans;
    cout<<"\t\tCROSS & NOUGHT GAME\n";
    do
    {
    for(p=1;p<=3;p++)
    {
    for(q=1;q<=3;q++)
    {
    m[p][q]='';
    }
    }
    int i,j,sum=0;
    while(sum<10)
    {
    if(sum==0)
    show_game_box();
    cout<<"\n\n\nPlayer 1 is'0'\n";
    cout<<"Player 1's turn\n";
    cout<>i;
    cout<>j;
    for(;(i>3)||(j<1)||('X'==m[i][j])||('0'==m[i][j]);)
    {
    cout<<"Sorry you entered wrong choice\n";
    cout<<"Enter your choice again\n";
    cout<>i;
    cout<>j;
    }
    m[i][j]=’0′;
    sum++;
    show_game_box();
    if((m[1][1]==’0′)&&(m[1][1]==m[1][2])&&(m[1][1]==m[1][3]))
    {
    cout<<"CONGRATULATIONS!!!!!!!!!!\n";
    cout<<"player 1 wins the game\n";
    break;
    }
    if((m[2][1]=='0')&&(m[2][1]==m[2][2])&&(m[2][1]==m[2][3]))
    {
    cout<<"CONGRATULATIONS!!!!!!!!!!\n";
    cout<<"player 1 wins the game\n";
    break;
    }
    if((m[3][1]=='0')&&(m[3][1]==m[3][2])&&(m[3][1]==m[3][3]))
    {
    cout<<"CONGRATULATIONS!!!!!!!!!!\n";
    cout<<"player 1 wins the game\n";
    break;
    }
    if((m[1][1]=='0')&&(m[1][1]==m[2][2])&&(m[1][1]==m[3][3]))
    {
    cout<<"CONGRATULATIONS!!!!!!!!!!\n";
    cout<<"player 1 wins the game\n";
    break;
    }
    if((m[1][3]=='0')&&(m[1][3]==m[2][2])&&(m[1][1]==m[3][1]))
    {
    cout<<"CONGRATULATIONS!!!!!!!!!!\n";
    cout<<"player 1 wins the game\n";
    break;
    }
    if((m[1][1]=='0')&&(m[1][1]==m[2][1])&&(m[1][1]==m[3][1]))
    {
    cout<<"CONGRATULATIONS!!!!!!!!!!\n";
    cout<<"player 1 wins the game\n";
    break;
    }
    if((m[1][2]=='0')&&(m[1][2]==m[2][2])&&(m[1][2]==m[3][2]))
    {
    cout<<"CONGRATULATIONS!!!!!!!!!!\n";
    cout<<"player 1 wins the game\n";
    break;
    }
    if((m[1][3]=='0')&&(m[1][3]==m[2][3])&&(m[1][1]==m[3][3]))
    {
    cout<<"CONGRATULATIONS!!!!!!!!!!\n";
    cout<<"player 1 wins the game\n";
    break;
    }
    if(sum==9)
    {
    cout<<"\t\tHURRAY!!!!! The game is over\n";
    cout<<"\t\tNO ONE WINS\n";
    cout<<"The game is draw\n";
    break;
    }
    cout<<"\n\n\nPlayer 2 is'X'\n";
    cout<<"Player 2's turn\n";
    cout<>i;
    cout<>j;
    for(;(i>3)||(j<1)||('X'==m[i][j])||('0'==m[i][j]);)
    {
    cout<<"Sorry you entered wrong choice\n";
    cout<<"Enter your choice again\n";
    cout<>i;
    cout<>j;
    }
    m[i][j]=’X';
    sum++;
    show_game_box();
    if((m[1][1]==’X')&&(m[1][1]==m[1][2])&&(m[1][1]==m[1][3]))
    {
    cout<<"CONGRATULATIONS!!!!!!!!!!\n";
    cout<<"player 2 wins the game\n";
    break;
    }
    if((m[2][1]=='X')&&(m[2][1]==m[2][2])&&(m[2][1]==m[2][3]))
    {
    cout<<"CONGRATULATIONS!!!!!!!!!!\n";
    cout<<"player 2 wins the game\n";
    break;
    }
    if((m[3][1]=='X')&&(m[3][1]==m[3][2])&&(m[3][1]==m[3][3]))
    {
    cout<<"CONGRATULATIONS!!!!!!!!!!\n";
    cout<<"player 2 wins the game\n";
    break;
    }
    if((m[1][1]=='X')&&(m[1][1]==m[2][2])&&(m[1][1]==m[3][3]))
    {
    cout<<"CONGRATULATIONS!!!!!!!!!!\n";
    cout<<"player 2 wins the game\n";
    break;
    }
    if((m[1][3]=='X')&&(m[1][3]==m[2][2])&&(m[1][1]==m[3][1]))
    {
    cout<<"CONGRATULATIONS!!!!!!!!!!\n";
    cout<<"player 2 wins the game\n";
    break;
    }
    if((m[1][1]=='X')&&(m[1][1]==m[2][1])&&(m[1][1]==m[3][1]))
    {
    cout<<"CONGRATULATIONS!!!!!!!!!!\n";
    cout<<"player 2 wins the game\n";
    break;
    }
    if((m[1][2]=='X')&&(m[1][2]==m[2][2])&&(m[1][2]==m[3][2]))
    {
    cout<<"CONGRATULATIONS!!!!!!!!!!\n";
    cout<<"player 2 wins the game\n";
    break;
    }
    if((m[1][3]=='X')&&(m[1][3]==m[2][3])&&(m[1][1]==m[3][3]))
    {
    cout<<"CONGRATULATIONS!!!!!!!!!!\n";
    cout<<"player 2 wins the game\n";
    break;
    }
    if(sum==9)
    {
    cout<<"\t\tHURRAY The game is over\n";
    cout<<"\t\tNO ONE WINS\n";
    cout<<"\t\tThe game is drawn\n";
    break;
    }
    }
    cout<>ans;
    }while((ans==’y')||(ans==’Y'));
    system(“PAUSE”);
    getch();
    }
    void show_game_box()
    {
    cout<<"\n 1 2 3\n"<<endl;
    cout<<" 1 "<<m[1][1]<<"|"<<m[1][2]<<"|"<<m[1][3]<<endl;
    cout<<" -|-|-\n";
    cout<<" 2 "<<m[2][1]<<"|"<<m[2][2]<<"|"<<m[2][3]<<endl;
    cout<<" -|-|-\n";
    cout<<" 3 "<<m[3][1]<<"|"<<m[3][2]<<"|"<<m[3][3]<<"\n\n\n";
    }

  • juhihumera says:

    can i have the list of all the funcions in c graphics……

  • suchit says:

    could anyone help me to get a code for conversion of a digital image file into the matrix containing the pixels values of the image..

  • sadi says:

    I need a program in computer graphics using c language. please write a program for moving a person with flag.thank you.

  • suryana says:

    can u give a tutorial about this.

    Project Name: Implementation of Recursion and Tracing its Stack (Graphically)

    Description: This project will implement and trace recursive functions graphically.

  • suryana says:

    i using a turbo c++ to do a graphical in C..this error be occur what should i do…
    Fatal ..\INCLUDE\GRAPHICS.H 19: Error directive: BGI graphics not supported under Windows

  • smartanu says:

    i using a tc3 to do a graphical in C..this error be occur what should i do…
    #include
    #include
    #include
    #include
    #include
    void draw(int x1,int y1,int x2,int y2);
    void main()
    {

    int x1,y1,x2,y2;
    int gdriver=DETECT,gmode,errorcode;
    initgraph(&gdriver,&gmode,”C:\\TC\\BGI”);
    printf(“Enter the first point \n”);
    scanf(“%d%d”,&x1,&y1);
    printf(“\n\n Enter the second point”);
    scanf(“%d%d”,&x2,&y2);
    printf(“\n\n The line is shown below”);
    draw(x1,y1,x2,y2);
    getch();
    }
    void draw(int x1,int y1,int x2,int y2)
    {
    int x,y,e,i,dx,dy,a;
    x=x1;
    y=y1;
    dx=x2-x1;
    dy=y2-y1;
    a=dx;
    dx=dy;
    dy=a;
    e=2*dy-dx;
    for(i=1;i0)
    {
    x=x+1;
    e=e-2*dx;
    }
    y=y+1;
    e=e+2*dy;
    }
    getch();
    }
    when i run this programme getting error
    Linker error:undefined symbol _putpixel in module myfile name.
    i have executed this programme in lab pc.

  • Saqib says:

    amit srivastava:
    You can capture the mouse movement using MFC in VC++ in the following way. Create a standard MFC exe file and in DocumentView calss there will be mouse events i.e. OnMouseMove(), OnLButtonDown(), you can get the position of mouse in any function. Both the function accepts two parameters (UINT nFlags, CPoint point). And in Point object there will be mouse position (x,y) and you can get them easily.

    @raj:
    You can get a calculator progam here.
    http://www.mycplus.com/free-utilities/scientific-calculator/

    @Gcablay_18:
    There are tutorials available here in C++ for creating classes.
    http://www.mycplus.com/tutorials/cplusplus-programming-tutorials/classes-2/

    @vineet:
    This function shutdown the graphics mode and returns to the position it was before the initgraph function was called. Closegraph function releases all the resources occupied by the graphics system like memry, fonts, drivers etc…
    You can learn more about graphics functions here
    http://www.mycplus.com/featured-articles/c-language-graphics-library-reference-part-1/


Leave a Reply

You must be logged in to post a comment.