11 и 61 ГОУ МГИУ Вторник, 05.08.2025, 15:12
Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Архив - только для чтения
Проект 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
Люди! Я наверное единственный человек, который еще даже не написал проект... sad sad sad В связи с этим, очень прошу кого-нибудь помочь мне это сделать... Я понимаю, что у многих из тех, кто способен на такое уже начались каникулы, но может вы выкроите пару-тройку минут, чтобы хоть как-то его написать (спецификации программы, wp, правильность и эффективность роли не играют wink ). Номер проекта 2,13 G. Вот исходники, а тут само задание... Заранее благодарен!

ЗЫ:
Вы сдали сессию? prof
Вам нечем заняться? booze
Напишите лишний проект!!! up



 
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, он сне вместо прямоугольника строит все что угодно... Например:
....___....
....\ . /....
.....\ /.....
...../ \.....
..../__\....
Прога вообще не проверяет - даются ли ей на вход точки на которых можно построить прямоугольник и в результате чертит произвольный четырехугольник... wacko



 
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 либо искать точки пересечения отрезка с овалом...

либо искать где может лежать точка чтобы отрезок не пересекал овал... cry


 
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 от данного отрезка).
Лучше уточни ТЗ на всякий пожарный wacko

Добавлено (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
weep я очень извиняюсь вопрос не очень интересный и глупый
но как мне введя в 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
cry блин всё исписал всё понимаю...не понимаю одного...
всё цепляется на следующем....
на a и b....(полуоси эллипса)
сразу нескольких вопросов возникает...
В проге же всё индуктивно делается фактически всё добавляется в цикле while true
1)Как a и b сунуть для работы в класс 1 РАЗ! чтобы он потом мог работать и в полигоне и в сегменте вообщем везде.......
2)Как использоваться a и b одновременно для класса и для метода не этого класса TkDrawer.oval(p,a,b,color)
weep :weep:
наверно пока всё...
.интересно меня кто нибудь поймем? biggrin

А ещё вопрос для знатоков геометрии....

я читал о том что
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, вот и я о том же, о чем и Ден. Идеалогически правильно написать простенький класс овалов, экономичный - глобальные переменные, но уж точно не так, как ты хотел сделать smile
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
 
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Copyright MyCorp © 2025