精华内容
下载资源
问答
  • 题目有两个定义个问题D1:两点之间的曼哈顿距离:横坐标的差的绝对值与纵坐标的差的绝对值之和。其含义就是在只能横、竖走的情况下,从a点到b点要走多长D2:个点到两条直线的曼哈顿距离:该点到两条直线上的所有...

    先看自己把问题读懂了吗!

    题目有两个定义、一个问题

    D1:两点之间的曼哈顿距离:横坐标的差的绝对值与纵坐标的差的绝对值之和。

    其含义就是在只能横、竖走的情况下,从a点到b点要走多长

    D2:一个点到两条直线的曼哈顿距离:该点到两条直线上的所有点的曼哈顿距离中的最小值。

    问题:n个点到两条线都有对应的曼哈顿距离,那么其中肯定有最大值;如果这两条线移动,这个最大值会变化。要求就是在坐标系上找出这两条直线,使得这个最大值最小。

    写程序之前先看自己在不用编程语言的情况下能做出来这道题吗,不能的话说明没找到相应的算法,更别提编程实现了。

    思路:

    ##### 1.先看某点到直线的曼哈顿距离如何求

    注意,直线与x轴的夹角为45°

    ![](/image_editor_upload/20191222082315_10637.jpg)

    至于曼哈顿距离为何在bb’线段内取得,想一想,很简单。

    所以,点a到直线的曼哈顿距离可映射为点a到直线的水平距离or竖直距离or垂直距离。

    点a与斜率为-1的直线也是一样的结果。

    ##### 2.但是,求的应为一个点到两条直线的曼哈顿距离

    到两条直线使得问题更复杂,因为两条直线都可以移动,只要保证互相垂直即可。

    故,对问题进行转化:

    找点a与两直线交点的关系

    ![](/image_editor_upload/20191222082542_54379.jpg)

    所以,一点到两直线的曼哈顿距离就等于| |Xo-Xa|-|Yo-Ya| |.

    ##### 3.但这不是仅有一个点,而是有n个点

    分析:

    ![](/image_editor_upload/20191222083158_14842.png)

    上图是n个点,可求出边界最大、小的X与Y值。

    对于该问题,两直线的垂心 O 一定不会在区域外,那么找到垂心,这个题就解出来了,即让| |Xo-Xa|-|Yo-Ya| |最大值最小的时候(说的真别扭),就找到了O。

    怎么用程序实现,不要问我,我连个动态规划都写不出来,还是找大佬吧,既然这个题能解出来,就能用编程去实现它了。但我感觉动态规划或者2分法能解出来吧(来自菜鸡的臆想)

    4.最后

    如何我写的有问题或有更好的解法,欢迎评论。

    求助:https://blog.dotcpp.com/a/64144

    问题 1476: [蓝桥杯][基础练习VIP]龟兔赛跑预测,我有个不成熟的想法。。。

    0.0分

    7 人评分

    展开全文
  • 两点线(java初级)

    千次阅读 2021-03-08 05:11:08
    都说两点确定一条直线,那么设计一个直线类Line,需要通过两个点Point对象来确定。Line类具体要求如下:1)定义两个Point对象p1,p2;2)写出有参构造方法,传递两个对象值给p1,p23)为p1,p2写出setters,和getters...

    此段代码略有难度,小伙伴们,可以自己尝试先做。实在不行,再来看代码。欢迎关注我嗷~。

    都说两点确定一条直线,那么设计一个直线类Line,需要通过两个点Point对象来确定。Line类具体要求如下:

    1)定义两个Point对象p1,p2;

    2)写出有参构造方法,传递两个对象值给p1,p2

    3)为p1,p2写出setters,和getters方法

    4)为Line写出一个getLength方法求直线中两点的长度

    5) 为LIne写一个ToString方法,方法如下所示:

    public String toString() { return "Line [p1=" + p1 + ", p2=" + p2 + "]"; }

    在Main类的main方法中,定义一个Line数组,数组长度通过键盘给出,然后通过键盘为每线段的两个Point对象的坐标赋值,并生成相应Line对象放入数组中,循环数组,输出每条直线的信息,以及两个点之间的距离。

    Point 类如下所示:

    public class Point {

    private int x, y;// x,y为点的坐标

    //求两点之间的距离

    public double distance(Point p1) {

    return Math.sqrt((p1.x -this.x)*(p1.x -this.x)+(p1.y-this.y)*(p1.y-this.y));

    }

    public Point(int x, int y) {

    super();

    this.x = x;

    this.y = y;

    }

    public int getX() {

    return x;

    }

    public void setX(int x) {

    this.x = x;

    }

    public int getY() {

    return y;

    }

    public void setY(int y) {

    this.y = y;

    }

    public Point() {

    super();

    x = y =0;

    }

    @Override

    public String toString() {

    return "Point [x=" + x + ", y=" + y + "]";

    }

    }

    输入格式:

    第一行输入数组的长度n 每一行输入一个Line对象的两个点对象的 x y的坐标,中间用空格隔开

    输出格式:

    循环输出,输出直线的信息,以及每条直线的两个点的距离,保留一位小数。

    输入样例:

    在这里给出一组输入。例如:

    2

    0 0 2 3

    1 3 2 5

    输出样例:

    在这里给出相应的输出。例如:

    Line [p1=Point [x=0, y=0], p2=Point [x=2, y=3]]

    此线段的长度为:3.6

    Line [p1=Point [x=1, y=3], p2=Point [x=2, y=5]]

    此线段的长度为:2.2

    答案:

    import java.util.Scanner;

    public class Main {

    public static void main(String[] args) {

    // TODO Auto-generated method stub

    Scanner iScanner=new Scanner(System.in);

    line line1=new line();

    int b=iScanner.nextInt();

    double[] a=new double[b];

    int z[][]=new int[b][4];

    for (int i = 0; i < z.length; i++) {

    for (int j = 0; j < z[i].length; j++) {

    int c=iScanner.nextInt();

    z[i][j]=c;

    }

    }

    for (int i = 0; i < z.length; i++) {

    line1.p1=new Point(z[i][0],z[i][1]);

    line1.p2=new Point(z[i][2],z[i][3]);

    a[i]=line1.getLength(line1.p1,line1.p2 );

    System.out.println(line1.toString());

    System.out.printf("此线段的长度为:%.1f",a[i]);

    System.out.println();

    }

    }

    }

    class Point {

    int x;// x,y为点的坐标

    int y;

    //求两点之间的距离

    Point p1,p2;

    public double distance(Point p1) {

    return Math.sqrt((p1.x -this.x)*(p1.x -this.x)+(p1.y-this.y)*(p1.y-this.y));

    }

    public Point(int x, int y) {

    super();

    this.x = x;

    this.y = y;

    }

    public int getX() {

    return x;

    }

    public void setX(int x) {

    this.x = x;

    }

    public int getY() {

    return y;

    }

    @Override

    public String toString() {

    return "Point [x=" + x + ", y=" + y + "]";

    }

    public void setY(int y) {

    this.y = y;

    }

    public Point() {

    super();

    x = y =0;

    }

    }

    class line extends Point{

    public double getLength(Point p1,Point p2)

    {

    return Math.sqrt((p1.x -p2.x)*(p1.x -p2.x)+(p1.y-p2.y)*(p1.y-p2.y));

    }

    public String toString() {

    return "Line [p1=" + p1 + ", p2=" + p2 + "]";

    }

    }

    展开全文
  • 都说两点确定一条直线,那么设计一个直线类Line,需要通过两个点Point对象来确定。Line类具体要求如下: 1)定义两个Point对象p1,p2; 2)写出有参构造方法,传递两个对象值给p1,p2 3)为p1,p2写出setters,和...

    7-5 两点成线 (10 分)
    都说两点确定一条直线,那么设计一个直线类Line,需要通过两个点Point对象来确定。Line类具体要求如下:
    1)定义两个Point对象p1,p2;
    2)写出有参构造方法,传递两个对象值给p1,p2
    3)为p1,p2写出setters,和getters方法
    4)为Line写出一个getLength方法求直线中两点的长度
    5) 为LIne写一个ToString方法,方法如下所示:
    public String toString() { return “Line [p1=” + p1 + “, p2=” + p2 + “]”; }

    在Main类的main方法中,定义一个Line数组,数组长度通过键盘给出,然后通过键盘为每线段的两个Point对象的坐标赋值,并生成相应Line对象放入数组中,循环数组,输出每条直线的信息,以及两个点之间的距离。
    Point 类如下所示:

    public class Point {
        private int x, y;// x,y为点的坐标
        //求两点之间的距离
        public double distance(Point p1) {
            return Math.sqrt((p1.x -this.x)*(p1.x -this.x)+(p1.y-this.y)*(p1.y-this.y));
        }
        public Point(int x, int y) {
            super();
            this.x = x;
            this.y = y;
        }
        public int getX() {
            return x;
        }
        public void setX(int x) {
            this.x = x;
        }
        public int getY() {
            return y;
        }
        public void setY(int y) {
            this.y = y;
        }
        public Point() {
            super();
            x = y =0;
        }
        @Override
        public String toString() {
            return "Point [x=" + x + ", y=" + y + "]";
        }
    }
    

    输入格式:
    第一行输入数组的长度n 每一行输入一个Line对象的两个点对象的 x y的坐标,中间用空格隔开

    输出格式:
    循环输出,输出直线的信息,以及每条直线的两个点的距离,保留一位小数。

    输入样例:
    在这里给出一组输入。例如:

    2
    0 0 2 3
    1 3 2 5
    输出样例:
    在这里给出相应的输出。例如:

    Line [p1=Point [x=0, y=0], p2=Point [x=2, y=3]]
    此线段的长度为:3.6
    Line [p1=Point [x=1, y=3], p2=Point [x=2, y=5]]
    此线段的长度为:2.2

    很遗憾测试点并不样例

    import java.util.Scanner; 
    
    class Point {
        private int x, y;// x,y为点的坐标
        //求两点之间的距离
        public double distance(Point p1) {
            return Math.sqrt((p1.x -this.x)*(p1.x -this.x)+(p1.y-this.y)*(p1.y-this.y));
        }
        public Point(int x, int y) {
            super();
            this.x = x;
            this.y = y;
        }
        public int getX() {
            return x;
        }
        public void setX(int x) {
            this.x = x;
        }
        public int getY() {
            return y;
        }
        public void setY(int y) {
            this.y = y;
        }
        public Point() {
            super();
            x = y =0;
        }
        @Override
        public String toString() {
            return "Point [x=" + x + ", y=" + y + "]";
        }
    }
    class Line{
    	Point p1,p2;
    	public Line(Point x,Point y){
    		p1=x;
    		p2=y;
    	}
    	
    	public Point getP1() {
    		return p1;
    	}
    
    	public void setP1(Point p1) {
    		this.p1 = p1;
    	}
    
    	public Point getP2() {
    		return p2;
    	}
    
    	public void setP2(Point p2) {
    		this.p2 = p2;
    	}
    	public double getLength() {
    		return p1.distance(p2);
    	}
    	public String toString() {
    		return "Line [p1=" + p1 + ", p2=" + p2 + "]";
    		}
    }
    public class Main {
    
    	public static void main(String[] args) {
    		
    		Scanner sc = new Scanner(System.in);
    		int n=sc.nextInt();
    		while(n!=0) {
    			int a=sc.nextInt();
    			int b=sc.nextInt();
    			int c=sc.nextInt();
    			int d=sc.nextInt();
    			n--;
    			Point x=new Point(a,b);
    			Point y=new Point(c,d);
    			Line l =new Line(x,y);
    			System.out.println(l.toString());
    			System.out.println("此线段的长度为:"+String.format("%.1f", l.getLength()));
    			//l.getLength();
    			}
    	   
             		
    		
    	}
    
    }
    

    代码说明

    • 引入 :import java.util.Scanner;
    • class Point {},复制题目给的
      毕竟一个类文档只能有一个public类
      这个类的public可以选择删去
    • Line类
    • Point p1,p2;(题目第一条)
    • 写出有参构造方法(题目第二条)
    • source->generate setters and getter
      给p1,p2,加上getset (题目第三条)
    • public double getLength() 直接调用 Point类的(题目第四条)
    • public String toString() 复制题目里给的(题目第五条)
    • Main 自由发挥
    展开全文
  • java实现画图板上画一条直线发布时间:2020-09-29 11:16:27来源:脚本之家阅读:96作者:NaiKuaii目标:在画图板上画一条直线,供大家参考,具体内容如下一、首先需要建立一个界面过程:1、创建界面对象(Java语言中...

    java实现画图板上画一条直线

    发布时间:2020-09-29 11:16:27

    来源:脚本之家

    阅读:96

    作者:NaiKuaii

    目标:在画图板上画一条直线,供大家参考,具体内容如下

    一、首先需要建立一个界面

    过程:1、创建界面对象(Java语言中已经有,可直接创建对象来使用)。

    2、对于一个界面,我们需要设置它的大小、居中、界面关闭、界面可见。

    3、写主方法去实现界面。

    (目前界面还未实现画图板的功能)

    public class DrawUI {

    //显示界面的方法

    public void show(){

    //创建界面对象

    JFrame jframe = new JFrame();

    //设置界面的尺寸、位置居中、关闭、标题

    jframe.setSize(1000, 900);

    jframe.setLocationRelativeTo(null);

    jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    jframe.setTitle("画图板v2.0");

    //设置界面可见

    jframe.setVisible(true);

    }

    //主方法

    public static void main(String[] args){

    DrawUI UI = new DrawUI();

    UI.show();

    }

    }

    二、创建监听器类

    1、重新创建一个监听器(Listener)的类:要在界面上实现画图,我们需要给界面添加监听器。====>实际上是让鼠标的一些指令能够在界面上有反应。换言之,监听器是一个连接鼠标与界面的桥梁。

    2、监听器类(Listener)实现鼠标监听器(MouseListener)的接口.

    3、加入鼠标监听器下的所有方法。

    public class Listener implements MouseListener{

    //鼠标点击

    public void mouseClicked(MouseEvent e){}

    // 鼠标按下

    public void mousePressed(MouseEvent e){}

    //鼠标松开

    public void mouseReleased(MouseEvent e){}

    // 进入

    public void mouseEntered(MouseEvent e){}

    // 退出

    public void mouseExited(MouseEvent e){}

    }

    三、实现画出直线

    1、创建监听器类(Listener)后,我们需要在界面类中添加监听器  =====> 在界面上添加监听器后,我们才能在界面上画图。(写在画图板“可见”之前 )。

    在画图板中输入一下代码

    //创建监听器

    Listener draw = new Listener();

    //添加监听器

    jframe.addMouseListener(draw);

    2、画一条直线,我们需要用Graphics (画布工具)用于画图。在此,画图板需要获取Graphics 并且监听器对象上设置该画布。

    (写在画图板“可见”之后)

    //获取Graphics

    Graphics graph = jframe.getGraphics();

    //给监听器的画布对象赋值

    draw.setGraphics(graph);

    然后转到监听器类(Listener)中输入代码

    3、开始画直线

    <1> 首先,画一条直线我们需要获取直线两端点的坐标。所以定义x1,y1,x2,y2。

    <2>画布画图,需要定义Graphics

    //记录坐标

    int x1,y1,x2,y2;

    //定义Graphics

    Graphics graph2;

    <3> 传画布(Graphics)值的方法 ====> 画图板上的画布值等于监听器上的画布值

    //传画布值的方法

    public void setGraphics(Graphics graph3){

    graph2 = graph3;

    <4>鼠标画出直线

    在鼠标按下事件中输入起点坐标

    public void mousePressed(MouseEvent e){

    //获取按下信息

    x1=e.getX();

    y1=e.getY();

    }

    在鼠标松开事件中输入终点坐标,并画出直线

    public void mouseReleased(MouseEvent e){

    //获取松开信息

    x2=e.getX();

    y2=e.getY();

    //画线

    graph2.drawLine(x1,y1,x2,y2);

    }

    四、完整过程:

    界面

    package Draw;

    import java.awt.Graphics;

    import javax.swing.JFrame;

    public class DrawUI {

    public void show(){

    JFrame jframe = new JFrame();

    jframe.setSize(1000, 900);

    jframe.setLocationRelativeTo(null);

    jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    jframe.setTitle("画图板v2.0");

    //创建监听器

    Listener draw = new Listener();

    //添加监听器

    jframe.addMouseListener(draw);

    jframe.setVisible(true);

    //获取Graphics

    Graphics graph = jframe.getGraphics();

    //给监听器的画布对象赋值

    draw.setGraphics(graph);

    }

    //主方法

    public static void main(String[] args){

    DrawUI UI = new DrawUI();

    UI.show();

    }

    }

    监听器

    package Draw;

    import java.awt.Graphics;

    import java.awt.event.MouseEvent;

    import java.awt.event.MouseListener;

    public class Listener implements MouseListener{

    //记录坐标

    int x1,y1,x2,y2;

    //定义Graphics

    Graphics graph2;

    //传画布值的方法

    public void setGraphics(Graphics graph3){

    graph2 = graph3;

    }

    public void mouseClicked(MouseEvent e){}

    public void mousePressed(MouseEvent e){

    //获取按下信息

    x1=e.getX();

    y1=e.getY();

    }

    public void mouseReleased(MouseEvent e){

    //获取松开信息

    x2=e.getX();

    y2=e.getY();

    //画线

    graph2.drawLine(x1,y1,x2,y2);

    }

    public void mouseEntered(MouseEvent e){}

    public void mouseExited(MouseEvent e){}

    }

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持亿速云。

    展开全文
  • 代码如下:function [x, y] = Cooline(x1, x2, y1, y2)%CooLINE Integer-coordinate line drawing algorithm.% [X, Y] = CooLINE(X1, X2, Y1, Y2) computes an% approximation to the line segment joining (X1, Y1) ...
  • 原标题:圆锥曲线中两条相交直线的斜率之积为定值,这你可能不会用 椭圆的内容高考中涉及的多,选择题、填空题属于中低档题,解答题则属于中高档题。椭圆的定义是高考的常考点,应掌握椭圆定义,参数a,b,c,e及a...
  • 下面是修正后的/// /// 计算两条直线的交点/// /// L1的1坐标/// L1的2坐标/// L2的1坐标/// L2的2坐标/// public static PointF GetIntersection(PointF lineFirstStar, PointF lineFirstEnd, PointF ...
  • 456 定义类point,然后线条类line继承了point类,正方形类square继承line类。78 */910 //类11 classPointDemo12 {13 private intx;14 private inty;15 private static int pCount=0;1617 //默认初始化坐.....
  • 留住今天的太阳回答于:2018-07-091. 没看出来Line的构造函数有什么好重载的...2. 浮点数的不精确不考虑了...3. 斜率无穷大这种事情由用户来保证不会发生...class Point {double x, y;Point(double x, double y) {...
  • 本文总结了B样曲线的产生背景,通过B样曲线与Bezier曲线的对比分析,来帮助理解B样基函数的定义,以及其定义区间、节点向量等相关概念。
  • 两点之间的距离 直接运用两点间距离公式 (x2-x1)^ 2+(y2-y1)^ 2开根号 //两点间距离 ...通常给出3个点,其中两个点构成一条直线,求另外一个点到直线的距离,我们将点与点的关系转换为向量之间关系进而利用向
  • 6-2 设计直线类 (20 分)

    2021-05-09 15:02:37
    两点可以确定一条直线,请设计一个直线类Line,需要通过两个点Point对象来确定。 设计类Point,包含两个坐标值,提供必要的构造函数和其他辅助函数 设计类Line,包含两个点,提供必要的构造函数和其他辅助函数 为...
  • matlab求两直线的夹角

    千次阅读 2020-12-21 01:31:30
    这里给出个具体的处理方式,其基本思想是:首先基于给定的节点定义出直线一般方程,然后求解方程组得到直线方程参数,最后根据得到的两条直线来求解出交点。因此,问题的输入为四个已知节点,输出为由已定节点定义...
  • 根据两个点的位置信息计算距离信息,动态的设置LineRenderer线的位置,将两点连接。动态创建Standard着色器的材质球,并将材质赋值给线,这样通过修改这个材质球颜色可以自定义线的颜色。 实现 显示距离 距离的计算...
  • 话题:定义一类Point,有横坐标x和纵坐标y,定义构造函数初始化,回答:#include class Point{private:double x;double y;public:Point(): x(0.0), y(0.0) {};Point(double x, double y){this-x = x;this-y = y;}...
  • 使用java自带的Point类import java.awt.Point;//引用awt包下的Point类,此类的功能是表示 (x,y) 坐标空间中的位置的public class Distance {public static void main...// 定义的坐标(5,6)Point p2 = new...
  • 变形2.如图,是正方体的平面图...已知空间四边形ABCD各边长与对角线都相等,求异面直线AB与CD所成的角的大小.解:分别取AC、AD、BC的中点P、M、N,连结PM、PN,由三角形中位线性质知PN∥AB,PM∥CD,于是∠MPN就是异面直线A...
  • 主要思想是:先重新定义z向量(在这里我是用了1e6个来描述1~300区间内的z值,并将之存储为double双精度类型变量);重新计算T1与TB;用T1-TB得出residu ;然后对于residu中凡是绝对值 < 容忍度(1e-5)的项目都...
  • Prism使用个(X)独立变量执行非线性回归,但稍微聪明一点,也可用个独立变量来拟合数据,有三种不同情况:拟合曲线族上图显示了竞争性酶动力学的样本数据,并显示了如何拟合曲线族。在此,每曲线显示了酶活性是...
  • 学cad就个字 记和练 记是记熟悉下面的命令 然后就勤练习没有捷径的 下功夫就能见效果 不用把它看得太困难3darray:创建三维阵列 3a3dface:创建三维面 3f3dorbit:控制在三维空间中交互式查看对象 3do3dpoly:在三...
  • 4 、电火花加工的原理与应 5、电解加工的应用有哪些【单选题】采用周铣的 方式 铣平面,铣刀线速度方向与工件进给方向相同的方式称为( )。【判断题】在对从表添加数据时,从表的外键字段的值必须来自主表中相应的字段...
  • 刘亚琼地区: 河南省 - 许昌市 - 襄城县学校:...了解平行线的概念、平面内两条直线的相交和平行的种位置关系, 知道平行公理以及平行公理的推论.3.会用符号语方表示平行公理推论, 会用三角尺和直尺过已知直线外...
  • 最近在水面无人艇(USV)模拟仿真中,用到了一些点和线的关系求解,本文主要讲述一下两点确认直线,点到直线距离,两条直线的交点等问题的解决方法,并给出python程序。部分内容非原创,文中给出链接,需要者可以参考...
  • 大一的求两直线公垂线方程公垂线是无数条的,公垂线段所在的直线是唯一一条第一条线的方向向量n1=(1,-1,0),第二条线的方向向量n2=(1,1,0)于是公垂线的方向向量n1*n2=(0,0,1)在l1上取A(t+1,-t+1,0) l2上取...
  • abxac * abxad >= 0 说明以ab线段为准,c,d两点都在同一侧,说明两个线段不会相交 cdxca * cdxcb >=0 说明以cd线段为准,a,b两点都在同一侧,说明两个线段不会相交 交点为o 然后根据线段定义 以a为起点,b-a为u, t...
  • 认识直线、射线和角

    千次阅读 2020-12-21 17:16:03
    认识两点间的距离,知道两点间所有连线中线段最短。2.进一步认识角,掌握角的表示方法,角的读法,知道角的各部分名称。理解射线和角的关系。3.渗透事物之间相互联系和变化的观点。在活动中培养学生观察、...
  • 看完这篇博客,诚邀感兴趣的各位参与脑暴,在评论区留言讨论,谈谈你的想法方案或者问题。 1、功能需求 在画板上可以对铅笔图元进行圈选然后进行系列操作 如下图,粗略的展示下这个功能: 2、功能分析 ...
  • 关于直线直线方程点到直线的距离用两点表示的直线2d隐式表示的直线的情形参数方程表示的直线一个点到射线或线段的距离代码实现距离计算是计算机图形学和计算几何的基本问题,而且有很多关于这方面的公式。...
  • 如果不这样做,对于绘制单个图形可能没什么影响,但是在绘制多个图形时(例如上面示例的两条直线),将会导致路径绘制或者颜色填充等操作出现任何意料之外的结果。 此外,对于closePath()方法,初学者一定要稍加注意,...
  • java编程 知道坐标求三角形做了部分题目要求写出个Point(点)类,该类具有x,y...写个Line(线)类,该类具有两个点属性p1、p2,有参构造函数(已知直线两个顶点的坐标) ,个计算两点间距的方法calcLength写个三...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 284,687
精华内容 113,874
关键字:

两点确定一条直线定义