Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Задачка для тренировки  (Прочитано 6787 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн rootv

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Задачка для тренировки
« Ответ #45 : 17 Июня 2013, 21:08:39 »
Вот на этом я ушел в аут :).
Да... звучит внушительно.
Если я хоть, что-то понял, вы предлагаете, мне использовать два прямоугольных треугольника, чтобы найти координату точки внутреннего/внешнего контура?

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

Тут главное не запутаться какая из двух точек при угле к какой "огибающей" относится...

То, что контур замкнутый, наверное, не принципиально?
Ну, а как удалось решить ситуацию с песочными часами? (как я понял, огибающая может пересекать сама себя? И это критично?)

Почему не пройти после окончания расчетов по каждой огибающей и не проверить наличие точек самопересечения отрезков, вставить эти точки в перечень и сделать замыкающими?
Проверяя цепь дальше, выбрасываем все точки до следующего самопересечения и повторяем процедуру?
 
А нужно ли это еще?

Оффлайн obgorelyi

  • Автор темы
  • Новичок
  • *
  • Сообщений: 45
    • Просмотр профиля
Re: Задачка для тренировки
« Ответ #46 : 17 Июня 2013, 22:46:27 »
Тогда зачем вообще нужна биссектриса?
..........
Тут главное не запутаться какая из двух точек при угле к какой "огибающей" относится...
Именно за этим биссектриса и нужна, чтобы не запутаться.

Ну, а как удалось решить ситуацию с песочными часами? (как я понял, огибающая может пересекать сама себя? И это критично?)

Почему не пройти после окончания расчетов по каждой огибающей и не проверить наличие точек самопересечения отрезков, вставить эти точки в перечень и сделать замыкающими?
Проверяя цепь дальше, выбрасываем все точки до следующего самопересечения и повторяем процедуру?
Вы сами описали решение задачи с песочными часами. А если огибающая пересечет саму себя, то это значит лишь одно! Фреза пройдет по исходному контуру, то есть сделает брак.

Если диплом писать по этой теме буду, могу скинуть копию. (Диплом на следующий год, и пока вот колеблюсь по поводу темы, автобалансировка или ЧПУ-станок). Если интересно конечно.

to Jack Sparrow:
Воспользовался вашим классом и засунул в класс Snake свою змейку, точнее квадрат Ганна :).
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys

clear = lambda: os.system('clear')
clear()

class Matrix:
  def __init__(self,n):
    self.matrix = [[0 for row in range(n)] for col in range(n)]
 
  def __str__(self):
    res=""
    for row in self.matrix:
      for col in row:
          res+=str(col)+"\t"
      res+="\n"
    return res

class Snake(Matrix):
  def __init__(self,n=5):
    # Проверим входные параметры
    #if direction not in ["clockwise","counterclockwise"]:
      #print("Ошибка: неверное направление змейки!")
      #sys.exit()
    #if first_step not in ["right","left","up","down"]:
      #print("Ошибка: неверно задано направление!")
   
    # Создаем змейку
    # Первым делом создадим нулевую матрицу
    self.matrix = [[0 for row in range(n)] for col in range(n)]
    # После чего займемся заполнением матрицы, алгоритм позаимствова у ArcFi, правда формулы мои,
    # и увы у меня на 2 условия больше, мои сонные мозги пока неспособны это упростить
    for L in range(len(self.matrix)):
      for C in range(len(self.matrix[L])):
          if C==L and L<=(n//2):
              self.matrix[L][C] = (n-2*L)**2-3*((n-2*L)-1)
          elif C>=L and L<(n//2) and C<n-L:
              self.matrix[L][C] = self.matrix[L][C-1]+1
          elif L>C and C<n-L-1:
              self.matrix[L][C] = self.matrix[L-1][C]-1
          elif L>C and C==n-L-1:
              self.matrix[L][C] = (2*L-n+2)**2
          elif L>n//2 and C>n-L-1 and C<=L:
              self.matrix[L][C] = self.matrix[L][C-1]-1
          elif (C>=n-L and L<=(n//2)) or (C>=n-C and L>(n//2)):
              self.matrix[L][C] = self.matrix[L-1][C]+1

a = Snake(7)
print(a)

Оффлайн rootv

  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Задачка для тренировки
« Ответ #47 : 17 Июня 2013, 23:43:44 »
Кстати, в геодезии если теодолитный ход замкнут, то накопленная погрешность просто распределяется по всей цепочке (можно пропорционально расстоянию от начала, можно пропорционально номеру точки/измерения).
Ну, это, конечно, от безвыходности...

 

Страница сгенерирована за 0.016 секунд. Запросов: 21.