精华内容
下载资源
问答
  • 练习内容:判断多个坐标是否在同一条直线上完整代码和注释如下print('请输入几个的横纵坐标,程序将会返回这几个是否在同一条直线上')def coor_nums():#获得每个值的横纵坐标int_list=[]#初始化坐标列表wrong_list...

    练习内容:判断多个坐标是否在同一条直线上

    完整代码和注释如下

    print('请输入几个点的横纵坐标,程序将会返回这几个点是否在同一条直线上')

    def coor_nums():#获得每个值的横纵坐标

    int_list=[]#初始化坐标列表

    wrong_list=[]#初始化错误列表

    judgement=''#判断是否需要修正坐标值

    while True:

    nums=input('应以x1 y1 x2 y2...的格式输入:\n')

    num_list=nums.split()

    if len(num_list)%2!=0:#如果输入的坐标长度不是偶数 说明输入错误

    print('请输入每个点的横纵坐标')

    continue

    for n in num_list:#对输入的每个值

    try:

    num=float(n)

    int_list.append(num)#尝试将输入的值转为浮点类型添加到坐标列表中

    except Exception as e:#如果发生异常

    print('你输入的第'+str(num_list.index(n)+1)+'个值为:'+n+',它不是数字 请按照要求输入')#提示修改

    wrong_list.append([num_list.index(n),n])#将错误坐标值的索引和错误坐标值都添加到错误列表

    int_list.append(n)#同时也将错误坐标值添加到坐标列表 便于修改

    judgement='need'#判断为need 即需要修改

    return int_list,wrong_list,judgement

    int_list,wrong_list,judgement=coor_nums()

    def adjust(wrong_list):#调整错误列表并且修改对应坐标列表

    right_list=[]#初始化修改后的列表

    for wrong_num in wrong_list:#对于每个错误值

    while True:#循环修改直到修改正确

    right_num_input=input('正在修改第{}个值,原值为:{},现值为:\n'.format(wrong_num[0]+1,wrong_num[1]))

    try:

    right_num=float(right_num_input)

    right_list.append([wrong_num[0],right_num])#将修改值添加到正确列表

    break

    except Exception as e:

    print('修改值仍然错误,请再次修改')

    continue

    return right_list

    def k_line_judge(int_list,wrong_list,judgement):#判断输入点是否在同一条直线

    if judgement=='need':#如果为need则需要调整初次输入的坐标值

    right_list=adjust(wrong_list)

    for n in right_list:

    int_list[n[0]]=n[1]#把每个修改后的值赋予坐标列表

    point_judge=list(set(int_list))

    if len(point_judge)==1:#如果输入的每个值相同 说明是同一个点

    return print('所有点是同一个点 为({},{})'.format(point_judge[0],point_judge[0]))

    k_list=[]#初始化直线斜率列表

    for n in range(3,len(int_list),2):#处理坐标列表

    try:

    k=(int_list[n]-int_list[n-2])/(int_list[n-1]-int_list[n-3])#斜率公式k=(y2-y1)/(x2-x1)

    k_list.append(k)#尝试向斜率列表中增加每两个点的斜率

    except ZeroDivisionError as e:#如果出现了x2-x1=0的情况 暂时先略过

    pass

    if n==len(int_list)-1 and len(k_list)==0:#如果循环到最后 直线斜率列表长度仍然为0

    return print('所有点在直线x={}上'.format(int_list[0]))#说明输入的坐标都在直线x=x1上

    set_k_list=list(set(k_list))

    if len(set_k_list)==1 and set_k_list[0]==0:#如果直线斜率列表长度为1 并且k=0 说明输入坐标都在y=y1上

    print('所有点在直线y={}上'.format(int_list[1]))

    elif len(set_k_list)==1 and set_k_list[0]!=0:#如果直线斜率列表长度为1 并且k不等于0

    line_k=set_k_list[0]#说明在一条y=kx+b的直线上

    line_b=int_list[1]-int_list[0]*line_k#b=y-kx

    if float(line_b)<=0:#分为b>0和b<=0两种打印情况

    print('所有点在直线y={}x{}上'.format(round(line_k,5),line_b))

    else:

    print('所有点在直线y={}x+{}上'.format(round(line_k,5),line_b))

    elif len(set_k_list)!=1:#如果斜率列表长度不为1说明不在同一条直线上

    print('所有点不在同一条直线上')

    k_line_judge(int_list,wrong_list,judgement)

    展开全文
  • 两条直线的交点,只需把这个二元一次方程联立求解,当这个联立方程组无解时,两直线平行;有无穷多解时,两直线重合;只有一解时,两直线相交于一点。常用直线向上方向与 X 轴正向的 夹角( 叫直线的倾斜角 )或...

    这里就要介绍一个概念:直线方程


    直线方程

    从平面解析几何的角度来看,平面上的直线就是由平面直角坐标系中的一个二元一次方程所表示的图形。求两条直线的交点,只需把这两个二元一次方程联立求解,当这个联立方程组无解时,两直线平行;有无穷多解时,两直线重合;只有一解时,两直线相交于一点。常用直线向上方向与 X 轴正向的 夹角( 叫直线的倾斜角 )或该角的正切(称直线的斜率)来表示平面上直线(对于X轴)的倾斜程度。可以通过斜率来判断两条直线是否互相平行或互相垂直,也可计算它们的交角。直线与某个坐标轴的交点在该坐标轴上的坐标,称为直线在该坐标轴上的截距。直线在平面上的位置,由它的斜率和一个截距完全确定。在空间,两个平面相交时,交线为一条直线。因此,在空间直角坐标系中,用两个表示平面的三元一次方程联立,作为它们相交所得直线的方程。


    在这里我们只需要用到直线方程的部分性质
    直线方程的一般式为: ax+by+c=0 a x + b y + c = 0
    在平面直角坐标系中,我们知道任意两个点的坐标就可求出经过这两个点的直线方程
    可得:

    a=y2-y1
    b=x1-x2//注意别写反了
    c=-ax1+by1

    显然只需要代入其他点判断是否满足一般式即可

    相关题目:洛谷1142轰炸

    此题代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int MAXN=710;
    int read()
    {
        int sum=0,flag=1;
        char c;
        for(;c<'0'||c>'9';c=getchar())if(c=='-') flag=-1;
        for(;c>='0'&&c<='9';c=getchar())sum=(sum<<1)+(sum<<3)+c-'0';
        return sum*flag;
    } 
    int n;
    int x[MAXN],y[MAXN];
    void init()
    {
        n=read();
        for(int i=1;i<=n;++i) x[i]=read(),y[i]=read();
    }
    int ans=1;
    int num;
    int main()
    {
        init();
        for(int i=1;i<=n;++i)
        for(int j=1;j<i;++j)
        {
            int a=y[j]-y[i];
            int b=x[i]-x[j];
            int c=-a*x[i]-b*y[i];
            num=0;
            for(int k=1;k<=n;++k)
            {
                if(a*x[k]+b*y[k]+c==0) num++;
            }
            ans=max(ans,num);
        }
        printf("%d",ans);
        return 0;
    }
    展开全文
  • 需求:给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。 分析思路: 1、将所有点二维坐标化,即定义出所有点的x,y坐标值 2、遍历出所有取出两点的情况(不考虑先后顺序),根据任意两点都确定一...

    需求:给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。

    分析思路:
    1、将所有点二维坐标化,即定义出所有点的x,y坐标值
    2、遍历出所有取出两点的情况(不考虑先后顺序),根据任意两点都确定一条直线,直线参数为k斜率,b与y轴交点的纵坐标(此时x=0),将他们放入一个列表中
    3、将所有直线放入一个集合并完成去重操作,增加直线的第三个参数n=0用于第四步判断每条直线上有几个点
    4、将所有点遍历并判断是否在集合中的直线上,若在直线上,则直线对应的n加1
    5、遍历所有代表直线的列表,取出n最大的直线其n值就是最多有n个点在此条直线上

    def line(point1, point2):     
    	#定义一个函数通过两点来计算出对应直线的参数,
    	#传入的参数point1、point2都是列表
    	try:
            y1 = point1[1]
            y2 = point2[1]
            x1 = point1[0]
            x2 = point2[0]
      	    #根据列表对应下标取出x、y值
            k = (y2-y1)/(x2-x1)
            #根据x、y值计算出斜率,当斜率无穷大时报错,进入except
            b = y1-k*x1
            #计算出b
            return [k, b,0]
            #返回直线参数,第三个参数为0,用来后面的计数
        except Exception:
            return ["+8", y1, 0]
            #当报错时意味着斜率为无穷大,我们用"+8"代替
    
    
    def judge_in(point_in, line_in):
    	#用来判断点是否在直线上,若在则返回True,
    	#若不在则返回False
        x_in = point_in[0]
        y_in = point_in[1]
        k_in = line_in[0]
        b_in = line_in[1]
        if k_in == "+8":
        #当斜率无穷大时,单独判断
            if b_in == y_in:
                return True
            else:
                return False
        elif y_in == x_in*k_in+b_in:
            return True
        else:
            return False
    
    """可以改变下方列表中点的参数"""
    point_list = [[1, 1], [3, 2], [5, 3], [4, 1], [2, 3], [1, 4]]
    #给出一个包含几个点的列表
    
    
    # point_list = [[1,1],[2,2],[3,3]]
    line_list = []
    #新建一个用来接收直线的空列表
    new_list = []
    #直线去重后加入此列表
    for i in range(len(point_list)):
        for j in range(i+1, len(point_list)):
        #通过双层的for循环给出所有两个点的组合
            line_s = line(point_list[i], point_list[j])
            #利用函数求出直线的前两个参数
            line_list.append(line_s)
    
    print(line_list)
    #得到的是一组有重复参数的直线
    for k in line_list:
        if k not in new_list:
        #去重
            new_list.append(k)
    for m in point_list:
        for n in new_list:
        #遍历所有点和线,判断点是否在线上,
        #若在则直线第三个用来计数的参数加1
            if judge_in(m, n):
                n[2] += 1
    print(new_list)
    #输出去重完毕后的列表,再经过一次遍历即可找出最多点所在的直线
    
    展开全文
  • #判断空间中的3个是否在同一直线上: 用向量计算时,需要确定个向量的长度和角度(角度由x、y、z轴的值确定)都相等,才能确保在同一直线上 @staticmethod def isThreePointsInSameLine(p1, p2, p3): distance12...
    	#判断空间中的3个点是否在同一直线上: 用向量计算时,需要确定两个向量的长度和角度(角度由x、y、z轴的值确定)都相等,才能确保在同一直线上
        @staticmethod
        def isThreePointsInSameLine(p1, p2, p3):
            distance12 = MathTool.getDistanceBetweenTwoPoints(p1, p2)
            distance23 = MathTool.getDistanceBetweenTwoPoints(p2, p3)
            distance13 = MathTool.getDistanceBetweenTwoPoints(p1, p3)
    
            #p1->p2的单位向量。
            p12X = math.fabs((p1.x - p2.x) / distance12)
            p12Y = math.fabs((p1.y - p2.y) / distance12)
            p12Z = math.fabs((p1.z - p2.z) / distance12)
            
            #p2->p3的单位向量
            p23X = math.fabs((p2.x - p3.x) / distance23)
            p23Y = math.fabs((p2.y - p3.y) / distance23)
            p23Z = math.fabs((p2.z - p3.z) / distance23)       
    
            #p1->p3的单位向量。
            p13X = math.fabs((p1.x - p3.x) / distance13)
            p13Y = math.fabs((p1.y - p3.y) / distance13)
            p13Z = math.fabs((p1.z - p3.z) / distance13)
                        
            err = R2.lineError #自定义的一个误差范围
            #如果p1->p2的单位向量与p2->p3的单位向量相等则表示在同一直线上。
            #由于向量是带方向的,但是相反方向的两个向量仍然在同一直线上
            #由于不是点的坐标不完全精确,所以要容忍一定的误差
            if MathTool.isInRange(p12X, p23X, err) and MathTool.isInRange(p12Y, p23Y, err) and MathTool.isInRange(p12Z, p23Z, err):
                if MathTool.isInRange(p12X, p13X, err) and MathTool.isInRange(p12Y, p13Y, err) and MathTool.isInRange(p12Z, p13Z, err):
                    return True
            return False 
    
    
        #计算空间上两个点的距离。
        #点在空间的坐标类似于p (x, y, z)
        @staticmethod
        def getDistanceBetweenTwoPoints(p1, p2):
            return math.sqrt((p1.x - p2.x) ** 2 + (p1.y - p2.y)  ** 2 + (p1.z - p2.z) ** 2)
        
        #是否在误差范围内:这里的error是在Resource中定义的键长、键角等误差
        #如果A - error <= B <= A + error,则认为A在B的误差范围内
        #通过数学证明,参数A和B等价,也就是将A和B互换后不影响结果
        @staticmethod
        def isInRange(A, B, error):
            if A - error <= B <= A + error: 
                return True
            else:
                return False
                
    

    ps:
    1、判断三个点是否在同一直线上的这个函数其实还是有点问题的:只考虑相同方向,没有考虑相反方向。但是这个项目已经结束了,软件也没有因为这个问题出过问题,我也就不准备再修复这个问题了。
    2、这里用了单位向量,似乎没有必要。https://blog.csdn.net/sinat_38972110/article/details/82115637?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-4.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-4.channel_param这里的方法似乎更简洁一些。

    展开全文
  • 思路一:两点确立一直线,判断其余的点是否在直线上;时间复杂度o(n^3) Submission Result: Time Limit Exceeded int maxPoints(vector &points) { vector vi=points; int xi,yi; int xj,yj; unsigned ...
  • java判断多个是否在同一直线上

    千次阅读 2015-11-14 22:08:30
    今天无聊打打java程序,遇到了判断多个是否在同一直线的问题,当时第一反应就是采用倒推法,先确定方程,再判断y==tx+c。这公式一时还想不起来,一元一次方程小学学的吧,看来把50%交给老师了。。。 最重要的...
  • 生花,ECharts 作品展示赛正式启动!>>> ...
  • 这是书的问题 6、平面,连接(x_1 〖,y〗_(1 ) )和(x_2 〖,y〗_(2 ) )的直线由如下方程定义: ax+by=c (其中,a=y_2-y_1,b=x_1-x_2,c=x_1 y_2-y_1 x_2) 这样一条直线把平面分成个半平面:其中一个...
  • C#判断点在直线上的方法

    千次阅读 2014-09-10 21:31:09
    C#中判断点在直线上的方法比较多,算法因人而异,我自己写的一个是判断待测点与两个端点的直线的长度的和与原直线的长度之差,程序主要计算是计算两点的距离代码如下: using System; using System.Collections....
  • 思路:依次遍历所有点,计算两点的斜率(考虑重合点和垂直点的特殊情况),非重合斜率相等的点则位于同一直线上。采用Map存储斜率,其中key值设为Double型的斜率,value值为Integer型的点数。 注意: Map接口中的...
  • C++语言实现一些基本算法(两点距离、点是否在直线上、点与直线的关系、两直线的夹角、两直线的交点、两个举行的重合面积等等)
  • 斜率相同的点在同一直线上。 相同位置的在同一直线上。 最多能有多少个位于同一直线上:斜率相同的 + 相同位置的 方法二: 循环遍历每个,先统计其他与当前的重合个数dup 以及与当前点在同一...
  • 对于给定的n个位于同一二维平面上的,求最多能有多少个位于同一直线上 Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. 思路 复杂度肯定是o(n^2)的,即...
  • 所以我们用向量方便一点, 我们任取作为基准, 算出一个向量(x1, y1), 然后枚举第三个, 算第二个和第三个的之间的向量, 然后通过判断向量是否平行的方式来判断这三点是否处于同一直线上, 也就是 x1*y2 ...
  • OpenJudge百练第4072号习题:判断多个是否同一直线题目描述解题思路参考答案测试用例小结 题目描述 来源 ...个互不重合的,并给出它们的坐标(xi,yi),问这些是否在同一直线上。 输入 第一...
  • 有N(1个互不重合的,并给出它们的坐标(xi,yi),问这些是否在同一直线上。 输入第一行是测试的组数T(1 输出有T行,每行对应输入的一组数据,如果该组数据中的点在同一直线上,则该行输出True,否则输出False。 ...
  • 任意练成一直线,判断是否再这条直线上 # 获取 max = 0 for i,ival in enumerate(points): for j,jval in enumerate(points): if i 拿到,获得矢量 # 根据公式 a= (y2-y1)/(x2-x1) a = (jval.y-...
  • 记:判断三个是否条直线上

    千次阅读 2019-10-25 22:43:19
    描述 纯哥想知道,平面上的三个是否条直线上 ...针对每组案例,如果三个点在同一条直线上,则输出Yes,否则输出No。 每组案例输出完都要换行。 样例输入 2 1 1 2 2 3 3 1 1 2 3 3 2 样例输出 ...
  • 判断最多有多少个能再一条直线上(n 解析:求任意构成的直线的方程 化为一般式:ax+by+c=0 得: a=y2-y1 b=x1-x2//注意别写反了 c=-ax1+by1 即可 不可思议的n = 700时n ^3也能过 #include
  • 给出二维平面上的n个点,求最多有多少点在同一条直线上。 样例 给出4个点:(1, 2), (3, 6), (0, 0), (1, 3)。 思路借助辅助二维数组,存储每两点之间的斜率和截距。代码# Definition for a point. # class ...
  • 开始拿到这个题的时候,首先就会想到两点确定一直线,若要判断相应的点是否在同一条直线上,仅需求出它们的斜率即可。 但是此题需注意的几点是:(1)当斜率不存在的情况:即(y2-y1)/(x2-x1)中(x2-x1)为0的...
  • 题目一:给定N个二维坐标(包含整形x,y),找到位于同一条直线上点的最大个数。  题目二:给定N个三维坐标(包含整形x,y,z),找到位于同一条直线上点的最大个数 。 思路:双循环O(N^2)。 先找第一个 i ,把它...
  • 算法思想:点和点条直线上,关键两点之间的斜率是否相同。开始自己写了一些,但过于理想化,且复杂,没有考虑全面,并且没有考虑到使用map集合。最后这种还是从从网上百度出来的: public int maxP...
  • 给出二维平面上的n个,求最多有多少点在同一条直线上。 样例: 给出4个:(1, 2), (3, 6), (0, 0), (1, 3)。 一条直线上最多有3个。 思想: 利用map#ifndef C186_H #define C186_H #include #include #...
  • 是否条直线判断-共线判断

    千次阅读 2017-11-01 15:03:45
    //判断三个是否条直线上 dfX[0] = vdfGeoX.at(nF1); dfY[0] = vdfGeoY.at(nF1); dfX[1] = vdfGeoX.at(nF2); dfY[1] = vdfGeoY.at(nF2); dfX[2] = vdfGeoX.at(nF3); dfY[2] = vdfGeoY.at(nF3); ...
  • java求解: ...思路:斜率相同的点在同一直线上。 相同位置的在同一直线上。最多能有多少个位于同一直线上 : 即 斜率相同的 + 相同位置的 package tree; class Point { //的数据结构 ...
  • 给出2D平面中的n个坐标,计算最多有多少个点在条直线上直线可以用斜率表示,即如果已知(x1,y1),(x2,y2)" role="presentation" style="position: relative;">(x1,y1),(x2,y2)(x1,y1),(x2,y2)
  • 给出二维平面上的n个,求最多有多少点在同一条直线上。 Explanation: 给出4个:(1, 2), (3, 6), (0, 0), (1, 3)。 一条直线上最多有3个。 Solution: 计算斜率冰雹存在hashmap中,注意 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,698
精华内容 13,079
关键字:

两点在同一条直线上