Проект 2 [программирование]
| |
ldo2 | Дата: Понедельник, 14.01.2008, 17:55 | Сообщение # 1 |
 Сержант
Группа: 11
Сообщений: 88
Статус: Offline
| 2.15i
Основная проблема современности - коммуникационная. jabber: ldo2@jabber.ru skype: ldo1
|
|
| |
Paravinci | Дата: Среда, 23.01.2008, 14:41 | Сообщение # 2 |
Группа: Удаленные
| http://msiu-prog.ifolder.ru/5069902 В общем, у меня было две идеи решения: либо (1) реализовать функцию нахождения расстояния между отрезками, либо (2) рассматривать единичную окрестность отрезка как объединение прямоугольника и двух кругов. (1) было сложнее реализовать но я сделал именно его. В общем, основные изменения сделаны в новом файле R2Segment.rb, где описаны два класса, которые и реализуют функцию нахождения расстояния. Добавился так же код вычисления того, что требуется в задании в Convex.rb, RunConvex.rb и RunTkConvex.rb. В файле TkDrawer.rb добвалены функции drawSegment, xt, yt (которые аналогичны x(p) и y(p)). В общем, все файлы были изменены довольно очевидным образом, поэтому расскажу про работу классов в R2Segment.rb. В R2Segment.rb реализовано два класса R2Segment и SegmentNeighbourhood. Первый представляет из себя просто отрезок, второй является окрестностью отрезка (создан только для удобства модифицирования Convex.rb, можно было бы обойтись и без него). Собственно, думаю интерес представляет только функция нахождения расстояния между отрезками. Вот алгоритм: Вход: Отрезки AB, CD, Выход: Расстояние от AB до CD. П1: проверить, пересекаются ли AB и CD. Если пересекаются, то вернуть 0. П2: найти проекцию EF отрезка AB на прямую, содержащую CD. П3: если E принадлежит AB, то d = d(CE, A), иначе d = +Inf, E = C. П4: если F принадлежит AB, то d = [d, d(FD, B)].min, П5: вернуть [d, d(AB, E), d(F, AR)].min. Где d(AB, E) - расстояние между точкой и отрезком. Единственные нетривиальные моменты - это вывод формул для проекции отрезка на прямую и расстояния между точкой и отрезком - решаются через параметрические уравнения отрезка. PS: Заметил одну ошибку: в файле R2Segment.rb нужно заменить строку 74 на: d = [ce.dist(a), ce.dist(b), ef.dist(a), ef.dist(b), fd.dist(a), fd.dist(b)].min
|
|
| |
KPOT_90 | Дата: Четверг, 24.01.2008, 18:09 | Сообщение # 3 |
 Начальник 61
Группа: Администраторы
Сообщений: 173
Статус: Offline
| Люди! Я наверное единственный человек, который еще даже не написал проект... В связи с этим, очень прошу кого-нибудь помочь мне это сделать... Я понимаю, что у многих из тех, кто способен на такое уже начались каникулы, но может вы выкроите пару-тройку минут, чтобы хоть как-то его написать (спецификации программы, wp, правильность и эффективность роли не играют ). Номер проекта 2,13 G. Вот исходники, а тут само задание... Заранее благодарен! ЗЫ: Вы сдали сессию? Вам нечем заняться? Напишите лишний проект!!! 
|
|
| |
kiv31 | Дата: Четверг, 24.01.2008, 18:36 | Сообщение # 4 |
Рядовой
Группа: 11
Сообщений: 39
Статус: Offline
| KPOT_90, проэкт тут http://msiu-prog.ifolder.ru/5087404 код мего-корявый Quote радыгин может признаться что автор кода извращенец имей в виду)Добавлено (24.01.2008, 18:36) --------------------------------------------- тесты сам пиши)
|
|
| |
KPOT_90 | Дата: Вторник, 29.01.2008, 15:48 | Сообщение # 5 |
 Начальник 61
Группа: Администраторы
Сообщений: 173
Статус: Offline
| kiv31, он сне вместо прямоугольника строит все что угодно... Например: ....___.... ....\ . /.... .....\ /..... ...../ \..... ..../__\.... Прога вообще не проверяет - даются ли ей на вход точки на которых можно построить прямоугольник и в результате чертит произвольный четырехугольник...
|
|
| |
kiv31 | Дата: Вторник, 29.01.2008, 21:33 | Сообщение # 6 |
Рядовой
Группа: 11
Сообщений: 39
Статус: Offline
| KPOT_90, прога соединяет точки в порядке их поступления...надо просто вводить их в нужном порядке но работает она всё равно правильно, даже для такого случая: ....___.... ....\ . /.... .....\ /..... ...../ \..... ..../__\....Добавлено (29.01.2008, 21:33) ---------------------------------------------
Quote (KPOT_90) Прога вообще не проверяет - даются ли ей на вход точки на которых можно построить прямоугольник она не должа это проверять - по умолчанию считается, что входные данные корректны, а если нет - то она вправе выдать всё что угодно
|
|
| |
KPOT_90 | Дата: Вторник, 29.01.2008, 21:53 | Сообщение # 7 |
 Начальник 61
Группа: Администраторы
Сообщений: 173
Статус: Offline
| kiv31, работает-то правильно, но мне кажется Радыгин вряд ли такую форму примет: типа вот вам Виктор Юрьевич прога - вводите точки в нужном ей порядке!)))
|
|
| |
kiv31 | Дата: Вторник, 29.01.2008, 22:53 | Сообщение # 8 |
Рядовой
Группа: 11
Сообщений: 39
Статус: Offline
| KPOT_90, уговорил, ща напишу проверку Добавлено (29.01.2008, 22:53) ---------------------------------------------
Code if crossing?(Segment.new(trp[0],trp[1]),Segment.new(trp[2],trp[3])) trp[1..2]=[trp[2],trp[1]] elsif crossing?(Segment.new(trp[1],trp[2]),Segment.new(trp[3],trp[0])) trp[2..3]=[trp[3],trp[2]] end вот)
|
|
| |
Evkingen | Дата: Вторник, 29.01.2008, 22:53 | Сообщение # 9 |
 Рядовой
Группа: 11
Сообщений: 46
Статус: Offline
| Наверное не стоило создавать отдельную тему.....потому что одна уже есть...но я столкнулся с проблемой которая может быть интересна всем и кто нибудь что нибудь мне посоветует и я думаю это не только мне может пригодиться..... Идея следущая мне нужно посчитать индуктивно кол-во ребер целиком лежащих вне заданного эллипса....но я столкнулся с такой ситуацией...
|
|
| |
ldo2 | Дата: Вторник, 29.01.2008, 22:53 | Сообщение # 10 |
 Сержант
Группа: 11
Сообщений: 88
Статус: Offline
| Надо смотреть, когда создается отрезок, лежит ли он целиком вне заданного эллипса(круга). Елси вопрос стоял в том, как определить пересекает ли отрезок эллипс, то можно найти точки пересечения прямой, содержащей отрезок, и эллипса и проверять принадлежат ли они отрезку
Основная проблема современности - коммуникационная. jabber: ldo2@jabber.ru skype: ldo1
|
|
| |
Evkingen | Дата: Вторник, 29.01.2008, 22:54 | Сообщение # 11 |
 Рядовой
Группа: 11
Сообщений: 46
Статус: Offline
| вот я так и хочу но не понимаю .... вариантов 2 либо искать точки пересечения отрезка с овалом... либо искать где может лежать точка чтобы отрезок не пересекал овал... 
|
|
| |
Paravinci | Дата: Вторник, 29.01.2008, 22:54 | Сообщение # 12 |
Группа: Удаленные
| Я бы на твоем месте искал точки пересечения отрезка с элипсом. Когда-то решал похожую задачу, но с окружностью. Напиши, в уровнение эллипса (если в каноническом вида x^2/a^2 + y^2/b^2 = 1, то напиши коэффициенты a и b, если они известны (+ смещение от начала координат, если нужно), а если не в каноническом, то напиши все уравнение). PS: А вообще, если у тебя есть два варианта, то решай тот, который быстрее пишется. В любом случае от тебя требуется обеспечить минимальную функциональность (хотя конечно лучше с графической иллюстрацией, т.е. если можешь изображай эти отрезки другим цветом и рисуй сам эллипс). Добавлено (01.12.2007, 20:05) --------------------------------------------- Добавление: Общая идея решение (я бы на твоем месте...): 1) поискал в гугле "параметрическое уравнение отрезка", 2) нашел значения x(t) и y(t), 3) подставил их в уравнения эллипса, решил бы полученное квадратное уравнение (где возможно упрастить на бумаге, алгоритм решения закодировать хоть через дискриминант, как в школе). 4) если *a) решений нет - прямая, на которой лежит отрезок не пересекает эллипс, т.е. отрезок заведомо лежит вне эллипса (т.е. тебе нужно его учитывать), *б) 0 <= t1 <= 1 ИЛИ 0 <= t2 <= 1, то отрезок пересекает эллипс (т.е. тебе не надо его учитывать), *в) иначе (решения есть, но они не принадлежат отрезку [0; 1]) - прямая, на которой лежит данный отрезок пересекает эллипс, хотя сам отрезок эллипс не пересекает. Нужна дополнительная проверка: если какая-нибудь точка отрезка лежит внутри эллипса, то весь отрезок лежит внутри эллипса (его не нужно учитывать), иначе весь отрезок лежит вне эллипса и его нужно учитывать.
|
|
| |
Twilight_Summoner | Дата: Вторник, 29.01.2008, 22:54 | Сообщение # 13 |
 Рядовой
Группа: Заблокированные
Сообщений: 37
Статус: Offline
| Народ, такое впечатление, что я включаю тупого, но я не понимаю, что такое 1-окрестность. Задача 2.16(h).
Разгильдяй, пофигист по жизни, весельчак)
|
|
| |
Paravinci | Дата: Вторник, 29.01.2008, 22:54 | Сообщение # 14 |
Группа: Удаленные
| Zaraki_Kenpachi, понятия не имею, если честно, но я бы подумал, что имеется в виду единичная окрестность (т.е. для отрезка - пространство, находящееся на расстоянии не более 1 от данного отрезка). Лучше уточни ТЗ на всякий пожарный  Добавлено (02.12.2007, 16:36) --------------------------------------------- Можешь посмотреть определение окрестности в [url=http://en.wikipedia.org/wiki/Neighbourhood_(mathematics)#In_a_metric_space]английской википедии[/url].
|
|
| |
Evkingen | Дата: Вторник, 29.01.2008, 22:54 | Сообщение # 15 |
 Рядовой
Группа: 11
Сообщений: 46
Статус: Offline
| я очень извиняюсь вопрос не очень интересный и глупый но как мне введя в RunTkConvex.rb строки a=gets.to_i b=gets.to_i воспользоваться этими переменными в функции add класса Polygon:-[
|
|
| |
Xaron1 | Дата: Вторник, 29.01.2008, 22:54 | Сообщение # 16 |
Группа: Удаленные
| Evkingen, идея такая, но мог и наврать: Code fig.add(R2Points.new(a,b)) .
|
|
| |
Evkingen | Дата: Вторник, 29.01.2008, 22:55 | Сообщение # 17 |
 Рядовой
Группа: 11
Сообщений: 46
Статус: Offline
| блин всё исписал всё понимаю...не понимаю одного... всё цепляется на следующем.... на a и b....(полуоси эллипса) сразу нескольких вопросов возникает... В проге же всё индуктивно делается фактически всё добавляется в цикле while true 1)Как a и b сунуть для работы в класс 1 РАЗ! чтобы он потом мог работать и в полигоне и в сегменте вообщем везде....... 2)Как использоваться a и b одновременно для класса и для метода не этого класса TkDrawer.oval(p,a,b,color) :weep: наверно пока всё... .интересно меня кто нибудь поймем? А ещё вопрос для знатоков геометрии.... я читал о том что a и b это полуоси.... (см. определение полуосей эллипса) а в TkDrawer.oval(p,a,b,color) видно что это радиусы кривизны...т.е от центра прибавляется и отнимается один радиус и аналогично происходит с другим по игрику.. .я говорю о том что a и b точно выступает в разных понятиях.... вообщем ппц полный...вроде всё понимаю а тут такие моменты неприятные....
|
|
| |
Paravinci | Дата: Вторник, 29.01.2008, 22:55 | Сообщение # 18 |
Группа: Удаленные
| Evkingen, Понять тебя не просто :), но если это именно то, что имеешь в виду... 1) Я бы сделал тупо в лоб (чувствую не самое красивое и оптимальное решение): в конструктор Void добавил бы два новых параметра (a и b), также бы добавил и в конструкторы производных классов эти параметры, и передавал их при создании нового экземпляра класса в окружности. 2) Что ты хочешь сделать? Если ты хочешь нарисовать окружность, то я тебя огорчу, так как у тебя работать не будет - ты должен передавать не параметры a и b, а прямоугольник, ограничивающий окружность (вычисляется элементарно, сам догадаешься, а нет - смотри код). То есть, для рисования эллипса по коэффициентам a и b ты должен добавить новый метод в TkDrawer (внимательно не тестировал, может не работать, но идея такая): Code def TkDrawer.drawOval(a, b) TkcOval.new(CANVAS, tx(a), ty(b), tx(-a), ty(-b)) end def TkDrawer.tx(x) SIZE/2 + SCALE*x end def TkDrawer.ty(y) SIZE/2 - SCALE*y end
|
|
| |
ShaDow007 | Дата: Вторник, 29.01.2008, 22:55 | Сообщение # 19 |
 Рядовой
Группа: 61
Сообщений: 5
Статус: Offline
| А как можно определить что точка зажата между двумя рёбрами с помощью эталоного проекта?
Мне всё так же 10 пальцев с лихвою хватит, сосчитать тех, кто меня если что подхватит! Что стоит - эта ночь без сна! Что стоит - эта жизнь без любви! Я вырос там, где ЗЛО и НЕНАВИСТЬ, Я вырос там, где слабым места НЕТ!
|
|
| |
kpp2 | Дата: Вторник, 29.01.2008, 22:55 | Сообщение # 20 |
Сержант
Группа: 11
Сообщений: 59
Статус: Offline
| поискать эту точку в массиве @points класса "полигон"
|
|
| |
ldo2 | Дата: Вторник, 29.01.2008, 22:55 | Сообщение # 21 |
 Сержант
Группа: 11
Сообщений: 88
Статус: Offline
| Evkingen, можно запоминать значения a и b например так: Code class Circle def initialize(a, b) @@a = a @@b = b end
def Circle.a @@a end def Circle.b @@b end end
Однажды создав, можно получать a и b там где надо Circle.a, Circle.b
Основная проблема современности - коммуникационная. jabber: ldo2@jabber.ru skype: ldo1
|
|
| |
Xaron1 | Дата: Вторник, 29.01.2008, 22:55 | Сообщение # 22 |
Группа: Удаленные
| Evkingen, вот и я о том же, о чем и Ден. Идеалогически правильно написать простенький класс овалов, экономичный - глобальные переменные, но уж точно не так, как ты хотел сделать P.S. Видишь, класс овалов совсем несложный, а ты ленился вчера его писать.
|
|
| |
Paravinci | Дата: Вторник, 29.01.2008, 22:56 | Сообщение # 23 |
Группа: Удаленные
| Да, но при этом, всё-равно его (экземпляр класса) придется передавать в конструкторы, а это не намного проще, чем тупо в лоб передавать просто две переменные. В твоем случае, однако, можно сделать проще, создав класс по паттерну одиночка (singleton). Если интересует, как могу позже написать пример кода.Добавлено (06.12.2007, 10:37) --------------------------------------------- А вообще, я не думаю, что сейчас будут придираться к "красивости" кода. Пиши так, как тебе проще, понятнее и быстрее. Лишь бы программа делала то, что нужно. Добавлено (06.12.2007, 16:09) --------------------------------------------- Сори, торопился в универ - не внимательно посмотрел (думал, что Circle - это обычный класс, а тут он по-сути как раз и есть одиночка...). В общем, сказал глупость :).
|
|
| |
kmeaw | Дата: Вторник, 29.01.2008, 22:56 | Сообщение # 24 |
 Рядовой
Группа: Проверенные
Сообщений: 35
Статус: Offline
| У меня не приняли код, который был написан "так, чтобы работало". Мне пришлось реализовывать класс Circle и передавать его в каждый конструктор. Идея с singleton-классом не совсем хороша, т.к., фактически, она мало чем отличается от использования глобальных переменных. Очень нелогично написан конструктор - он должен инициализировать поля экземпляра, но никак не класса! Тогда уж лучше делать это не в конструкторе, а в отедльном методе класса (например, Circle.set). Следует также помнить, что многие вещи, которые Ruby легко позволяет сделать за счёт "открытых" классов и динамической типизации (например, расширить Kernel), не всегда можно реализовать в других языках и такие модули сильно нарушают целостность программы - попробуйте подключить два модуля, написанных в таком стиле. Если всё-таки хочется писать меньше кода - лучше написать кодогенератор на самом Ruby, ведь для этого предоставлены все средства (eval, class_eval, а для особо тяжёлых случаев можно использовать sexp и даже ruby2ruby). Как вариант, можно попробовать перехватывать чужие сообщения, инкапсулируя такой код в модули: Code class X def u puts "I am an original X method" end end
module Injected class X def u puts "Injected!" end end X.new.u # => "Injected!" end
X.new.u # => "I am an original X method" Таким образом, можно "вмешиваться" в чужие сущности, не нарушая их целостности.
-- kmeaw aka bdd1
|
|
| |
Ванька | Дата: Вторник, 29.01.2008, 22:56 | Сообщение # 25 |
 Рядовой
Группа: 11
Сообщений: 16
Статус: Offline
| У меня вопрос: в эталонном проекте точки выпуклой оболочки где-то сохраняются? Если да , то как "пробежаться" по ним?
Я vkontakte
|
|
| |
|