注册 登录
编程论坛 C++教室

c++ 编程问题~!有一个点Point(x,y),已知有一条线,线的两个点分别是PointStart(x1,y1),PointEnd(x2,y2),写一个程序

yuan453 发布于 2013-09-13 08:06, 2067 次点击
证明点Point在线的上面,线的下面还是在这条线上


c++!!

[ 本帖最后由 yuan453 于 2013-9-13 08:52 编辑 ]
10 回复
#2
yuccn2013-09-13 08:22
读过高中之后,做这道题就不难了,
用向量来做
#3
peach54602013-09-13 08:24
楼上所言极是...楼主自己根据高中的数学公式写吧...
#4
yuccn2013-09-13 08:34
求出x 到x1 和x2 的向量,比如(x01,y01),(x02,y02),如果共线,x01 * x02 - y01*y02 = 0,这个是向量共线的一个充分必要条件
x01= x - x1
y01= y - y1

x02 同样计算
y02
#5
rjsp2013-09-13 09:20
什么叫“线的下面还是在这条线上”?
#6
yuan4532013-09-13 09:43
回复 5楼 rjsp
线的上方, 线的下方  还有这条线经过这个点
#7
peach54602013-09-13 09:53
回复 6楼 yuan453
哦...没看见还要算上下方咧

那就算斜率吧...
#8
qunxingw2013-09-14 08:53
先求直线方程,把待求点的xp代入方程求y,最后比较yP和y。解析几何画下很直观

[ 本帖最后由 qunxingw 于 2013-9-14 09:00 编辑 ]
#9
blueskiner2013-09-16 09:02
#ifndef __LINE_H__
#define __LINE_H__

// 平面点类
class Point
{
public:
    Point();
    Point(int x, int y);
    Point(const Point& other);

    ~Point();

    Point& operator=(const Point& other);

    int getX()const{return m_x;}
    int getY()const{return m_y;}

private:
    int m_x;
    int m_y;
};

// 平面线类
class Line
{
public:
    Line();
    Line(const Point& pStart, const Point& pEnd);
    ~Line();

    bool isOnLine(const Point& pt)const;

private:
    Point m_start;
    Point m_end;
};

#endif    // __LINE_H__
// end of line.h

#include "line.h"
#include <iostream>

Point::Point() : m_x(0), m_y(0)
{
    std::cout << "Point : A original point" << std::endl;
}

Point::Point( int x, int y ) : m_x(x), m_y(y)
{
    std::cout << "Point : " << x << "," << y << std::endl;
}

Point::Point( const Point& other ) : m_x(other.m_x), m_y(other.m_y)
{
    std::cout << "Copy a point : " << m_x << "," << m_y << std::endl;
}

Point::~Point()
{
}

Point& Point::operator=( const Point& other )
{
    m_x = other.m_x;
    m_y = other.m_y;
    return *this;
}

//////////////////////////////////////////////////////////////////////////

Line::Line()
{
    std::cout << "Line : A original point" << std::endl;
}

Line::Line( const Point& pStart, const Point& pEnd )
{
    m_start = pStart;
    m_end = pEnd;
    std::cout << "Line : Start(" << pStart.getX() << "," << pStart.getY() << ")" << '\t';
    std::cout << "End(" << pEnd.getX() << "," << pEnd.getY() << ") " << std::endl;
}

Line::~Line()
{
}

bool Line::isOnLine( const Point& pt ) const
{
    // (x1*y2-x2*y1)=(x1*y3-x3*y1)网摘算法
    const int& x = pt.getX();
    const int& y = pt.getY();
    int t1 = m_start.getX() * m_end.getY();
    t1 -= m_end.getX() * m_start.getY();
    int t2 = m_start.getX() * y;
    t2 -= x * m_start.getY();
    if (t1 == t2) {
        return true;
    }
    return false;
}    // end of line.cpp

主函数调用:
Point p1(2, 2);
Point p2(3, 3);
Point p3(4, 4);
Line l(p1, p2);
if (l.isOnLine(p3)) {
    std::cout << "Is on the Line" << std::endl;
} else {
    std::cout << "Not on the Line" << std::endl;
}


关于线上还是线下(相对平面而言),我就不写完了。楼主请再自行思考下。上面的代码只是参考,考虑并不全面。
#10
TonyDeng2013-09-16 09:49
先在數學上解決了這個問題,再談如何寫程序。程序用什麽語言寫都不是問題,代碼只是表達思想的工具,思想都沒整理清楚,談程序怎麽寫是沒用的。這個問題也不是表面看的那麽簡單,其中需要注意的細節很多,比如用斜率的時候要考慮直線與y軸平行、兩點是同一點等等很細微的問題,都是要處理的。
#11
TonyDeng2013-09-16 16:57
判斷點在直線的上方還是下方,是比較簡單的:先用兩點式求出直線的方程,然後用第三點的y坐標求出直線上的點(即過該點作平行於x軸的線與直線相交的那點)的x値,根據兩點直線斜率的正負判斷該點的方位。直線若垂直於x軸,則是無上下方概念的,這與斜率無限大的特殊情形相同。先把兩點式直線的方程寫出來,根據有效條件判定圖像的確定性,排除了特例之後,再按常規判斷即可。

[ 本帖最后由 TonyDeng 于 2013-9-16 17:01 编辑 ]
1