0

I am having trouble creating a straight line from 2 points. As far as I understand, points coordinates are calculated by the origin. The origin is positioned in the middle of the canvas. I have only done drawing the canvas. Does anyone have a solution?
For test:
can = Canvas(31, 11, "+")
l = Line(0, 5, 0, -5)
can.draw(l, "L")
can.display()
It must be:
+ + + + + + + + + + + + + + + L + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + L + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + L + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + L + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + L + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + L + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + L + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + L + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + L + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + L + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + L + + + + + + + + + + + + + + +

class Canvas():
    def __init__(self, width, height, background = " "):
        """Constructor for the Canvas class
        """

    def display(self):
        """
        Printing method for the canvas. When triggered outputs the canvas as characters.
        Example outputs are given in the test cases. White spaces may be used as you prefer,
        but you must have *at least* one whitespace between every character. 
        """
    def draw(self, toDraw, color="A"):
        """
        When given a Line draw all points on the Line. We are currently working with an approximation.
        Any point with an euclidian distance to the line of less than or equal 0.7 is drawn.
        Make sure to clip your lines using the Cohen-Sutherland algortihm.
        After clipping, floor the coordinates of the endpoints

        """
class Line():
    def __init__(self, x1, y1, x2, y2):
        """Constructor for Line
        The first point is (x1, y1), the second point is (x2, y2).
        All coordinates are given as cartesian coordinates.
        """
        self.x1 = x1
        self.x2 = x2
        self.y1 = y1
        self.y2 = y2

1 Answers1

0

look this :Check is a point (x,y) is between two points drawn on a straight line

Checking if point on line but it will be showing no results. Computing the difference beetwin the Hypotenus and the sum of 2 lines linking the point ant the verteces of the line.

d = lambda p1,p2: ((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2)**.5 #Distance beetwin 2 poins
on = lambda pf,pt,point: d(pf,pt) - (d(pf,point)+d(pt,point)) #difference between hypotenus and 2 lines ...

def draw(points, w=10, h=10):
    '''
    This is not the optimized one, it just check all points 
    '''
    l = [[(1 if (x,y) in points else 0) for y in range(h)] for x in range(w)] #1=point
    print('\n'.join([' '.join([('.' if x else '0') for x in y]) for y in l]))

r = 0.1 #This will set the presition of your line
points = [(x,y) for x in range(10) for y in range(10) if abs(on(p1,p2,(x,y)))<0.1]

With r = 0.01

0 . 0 0 0 0 0 0 0 0
0 0 . 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 . 0 0 0
0 0 0 0 0 0 0 . 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

With r = 0.1

0 . 0 0 0 0 0 0 0 0
0 0 . . 0 0 0 0 0 0
0 0 0 . . 0 0 0 0 0
0 0 0 0 . . 0 0 0 0
0 0 0 0 0 . . 0 0 0
0 0 0 0 0 0 0 . 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
Henry
  • 577
  • 4
  • 9