2016-10-27 2 views
1

Я хочу, чтобы нарисовать треугольник, как это:Как нарисовать случайный треугольник и его медиану?

enter image description here

Я пробовал разные способы ее решения, но я не сделал это правильно. Как добавить медианные линии в треугольник? Может ли кто-нибудь помочь и объяснить это мне?

from turtle import * 
import random 

def allTriMedian (w=300): 
    speed (0) 
    vertices = [] 
    point = turtle.Point(x,y) 

    for i in range (3): 
     x = random.randint(0,300) 
     y = random.randint(0,300) 
     vertices.append(trutle.Point(x,y)) 
     point = turtle.Point(x,y) 
     triangle = turtle.Polygon(vertices) 

    a = triangle.side() 
    b = triangle.side() 
    c = triangle.side() 
    m1 = tirangle.median 
    m2 = triangle.median 
    m3 = triangle.median 

Я пытался поставить уравнение непосредственно

def Median (a, b, c): 
    m1 = sqrt((((2b^2)+(2c^2)-(a^2)))) 
    m2 = sqrt((((2a^2)+(2c^2)-(b^2)))) 
    m3 = sqrt((((2a^2)+(2b^2)-(c^2)))) 
    triangle.setFill("yellow") 
    triangle.draw(allTriMedian) 

Или я думал, чтобы найти среднюю точку и нарисовать отрезок линии, чтобы соединить вершины и срединных.

def getMid(p1,p2): 
     return ((p1[0]+p2[0])/2, (p1[1] + p2[1])) 
     mid1 = Line((point(p1[0]+p2[0])/2),point(x)) 
     mid2 = Line((point(p2[1]+p3[1])/2),point(y)) 
+0

код не правильный отступ, используйте кнопку '{}' формат в редакторе уценки. Также StackOverflow - это место для общих вопросов программирования, объясняющих этот конкретный код для вас, не будет полезно для будущих читателей, поэтому этот вопрос не соответствует теме. –

+1

Даже если бы это было по теме, я не уверен, что объяснение решения вам так, как вы хотите, действительно поможет вам. Огромная часть программирования связана с решением проблем - даже если вы не знаете, как писать код, чтобы делать то, что вы хотите, вы должны, по крайней мере, определить алгоритм, описывающий процесс решения проблемы, затем если у вас есть это, вы можете поместить его в код. –

ответ

2

Ненавижу делать математику. Давайте посмотрим, сможем ли мы решить это, бросив черепах в проблему. Много черепах.

Мы будем случайным образом генерировать вершины треугольника. Принимая пары вершин в свою очередь, мы начнем черепаху в каждом направлении по направлению к другому. Когда черепахи сталкиваются (в средней точке), мы уничтожим одну черепаху и отправим другую в сторону вершины не в паре. Как только мы сделали это три раза (с шестью черепахами), у нас должен быть соответствующий рисунок. Ну, в основном (без заливки в моем решении):

from turtle import Turtle, Screen 
from random import seed, randint 

WIDTH, HEIGHT = 640, 480 

def meet_in_the_middle(turtle_1, turtle_2): 

    position_2 = turtle_2.position() 

    while True: 
     turtle_1.setheading(turtle_1.towards(turtle_2)) 
     turtle_1.forward(1) 
     position_1 = turtle_1.position() 
     if int(position_1[0]) == int(position_2[0]) and int(position_1[1]) == int(position_2[1]): 
      break 

     turtle_2.setheading(turtle_2.towards(turtle_1)) 
     turtle_2.forward(1) 
     position_2 = turtle_2.position() 
     if int(position_2[0]) == int(position_1[0]) and int(position_2[1]) == int(position_1[1]): 
      break 

seed() 

screen = Screen() 
screen.setup(WIDTH * 1.25, HEIGHT * 1.25) 

vertices = [] 

for _ in range(3): 
    x = randint(-WIDTH//2, WIDTH//2) 
    y = randint(-HEIGHT//2, HEIGHT//2) 
    vertices.append((x, y)) 

A, B, C = vertices 

turtle_AtoB = Turtle(shape='turtle') 
turtle_AtoB.penup() 
turtle_AtoB.goto(A) 
turtle_AtoB.pendown() 

turtle_BtoA = Turtle(shape='turtle') 
turtle_BtoA.penup() 
turtle_BtoA.goto(B) 
turtle_BtoA.pendown() 

meet_in_the_middle(turtle_AtoB, turtle_BtoA) 

turtle_BtoA.hideturtle() 
turtle_AtoB.setheading(turtle_AtoB.towards(C)) 
turtle_AtoB.goto(C) 
turtle_AtoB.hideturtle() 


turtle_BtoC = Turtle(shape='turtle') 
turtle_BtoC.penup() 
turtle_BtoC.goto(B) 
turtle_BtoC.pendown() 

turtle_CtoB = Turtle(shape='turtle') 
turtle_CtoB.penup() 
turtle_CtoB.goto(C) 
turtle_CtoB.pendown() 

meet_in_the_middle(turtle_BtoC, turtle_CtoB) 

turtle_CtoB.hideturtle() 
turtle_BtoC.setheading(turtle_BtoC.towards(A)) 
turtle_BtoC.goto(A) 
turtle_BtoC.hideturtle() 


turtle_CtoA = Turtle(shape='turtle') 
turtle_CtoA.penup() 
turtle_CtoA.goto(C) 
turtle_CtoA.pendown() 

turtle_AtoC = Turtle(shape='turtle') 
turtle_AtoC.penup() 
turtle_AtoC.goto(A) 
turtle_AtoC.pendown() 

meet_in_the_middle(turtle_CtoA, turtle_AtoC) 

turtle_AtoC.hideturtle() 
turtle_CtoA.setheading(turtle_CtoA.towards(B)) 
turtle_CtoA.goto(B) 
turtle_CtoA.hideturtle() 

screen.exitonclick() 

Черепахи на работе:

enter image description here

Законченный рисунок:

enter image description here

+0

Мне нравится заниматься математикой, но ваше решение, сделанное с помощью черепахи, смешно. – am2

0

благодаря cdlane, я взял его кода и добавить некоторые функции в функции, чтобы сделать его немного понятным (по крайней мере для меня)

# -*- coding: cp1252 -*- 
import turtle 
from turtle import Turtle, Screen 
from random import seed, randint 

WIDTH, HEIGHT = 640, 480 
def create_screen(width, height): 
    screen = Screen() 
    screen.setup(width * 1.25, height * 1.25) 
    return screen 

def create_points(count,width = WIDTH, height = HEIGHT): 
    vertices = [] 

    for _ in range(count): 
     x = randint(-width//2, width//2) 
     y = randint(-height//2, height//2) 
     vertices.append((x, y)) 
    return vertices 

def create_turtle_at_position(position): 
    turtle = Turtle(shape='turtle') 
    turtle.hideturtle() 
    turtle.penup() 
    turtle.goto(position) 
    turtle.showturtle() 
    turtle.pendown() 
    return turtle 

def meet_in_the_middle(turtle_1, turtle_2): 

    position_2 = turtle_2.position() 

    while True: 
     turtle_1.setheading(turtle_1.towards(turtle_2)) 
     turtle_1.forward(1) 
     position_1 = turtle_1.position() 
     if int(position_1[0]) == int(position_2[0]) and int(position_1[1]) == int(position_2[1]): 
      break 

     turtle_2.setheading(turtle_2.towards(turtle_1)) 
     turtle_2.forward(1) 
     position_2 = turtle_2.position() 
     if int(position_2[0]) == int(position_1[0]) and int(position_2[1]) == int(position_1[1]): 
      break 

    turtle_1.hideturtle() 
    turtle_2.hideturtle() 

    return create_turtle_at_position(position_2) 

def draw_median(P1st, P2nd, POpposite): 
    turtle_AtoB = create_turtle_at_position(P1st) 
    turtle_BtoA = create_turtle_at_position(P2nd) 
    turtle_AandBmiddle = meet_in_the_middle(turtle_AtoB, turtle_BtoA) 
    turtle_AandBmiddle.setheading(turtle_AandBmiddle.towards(POpposite)) 
    turtle_AandBmiddle.goto(POpposite) 
    return turtle_AandBmiddle 

seed() 

sc = create_screen(WIDTH, HEIGHT) 
for _ in range(5): 
    sc = create_screen(WIDTH, HEIGHT) 
    A, B, C = create_points(3) 
    draw_median(A,B,C) 
    draw_median(B,C,A) 
    draw_median(C,A,B) 

sc.exitonclick() 
0

математический это самый простой способ рассчитать это по вектору. Позвольте мне сказать, что вы имеете треугольник ABC и хотите нарисовать линию от A до середины BC, чтобы ваш вектор начинался с A и заканчивался на A + AB + 1/2 BC или A + AC + 1/2 CB (векторный)

(ax) + (bx - ax) + 0.5 (cx - bx) 
(ay) (by - ay)  (cy - by) 

, что приводит к координатам для противоположной точки

x = 0.5(cx + bx) 
y = 0.5(cy + by)