FallenSoul
|
|
« : 27-09-2006 18:27 » |
|
Добрый день. Я студент 1 курса, факультета ПМВТ, по специальности Электронно Вычисл. Машины, вычисления, системы, комплексы , сети. У нас есть дисциплина, "Алгоритмические языки программирования" на которых сейчас идет курс лекций по С++. Среда Borland C++ 3.1 .Лекции лекциями, а препод лишнего слова не скажет. Лазил по поиску, нашел ваши уроки. Прочёл на данный момент 8,- элементарные математические задачи не вызывают никаких сложностей. Практикуюсь на примерах кот. только в голову придут-одним словом проблем нет, всё идет ок. Но вот препод известил нас, что на след.неделе будет Лаб.Работа. "Задание такое-то .Решайте, как-мне всё равно." Так вот, всё бы хорошо если бы задание было одно- сложное уровнение, включающее в себя большинство математических действий( sin ,arccos , ^x, / , ln , ... ). Так вот,- уравнение особых затруднений не вызывает, но второе задание- график. График состоит из 2ух закрашенных областей, в виде треугольников. Имеется система координат, с заданным еденичным отрезком и координатами точек, обозначающими треугольники. Вопрос. Вручную через cin>>x>>y; вводятся координата 2ух точек,по которой проверяется условие: входит или не входит точка в заштрихованную область 2ух треугольников. Вопрос: Как осуществить описанное?
|
|
|
Записан
|
|
|
|
Sands
Помогающий
Offline
|
|
« Ответ #1 : 27-09-2006 18:38 » |
|
По идее надо проверять условие того, что точка входит в первый треугольник и во второй треугольник => она входит в область-пересечение 2-х треугольников. Или я не правильно понял суть, тогда прошу более конкретизировать.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #2 : 27-09-2006 18:41 » |
|
FallenSoul, На будушее, пожайлуста покорректнее пиши тему топика.
По твоей задаче. Проверять находится ли точка сразу в двух треугольниках. Проверяеш первый треугольник на вхождение. Если есть вхождение, затем второй. Вы должны уже начать учить Аналитическую алгебру. Посмотри там свойства треугольника. И подумай, на чем можно узнать, входит ли точка в внутренее пространство треугольника или нет. Моё предложение узнавать плошади трех обозровавшихся треугольков , и сравнивать с плошадью большого треугольника. Если они равны, значит точка входит в треугольник, иначе не входит.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
FallenSoul
|
|
« Ответ #3 : 27-09-2006 18:51 » |
|
Я немного неправильно сформулировал, на чертеже 2 треугольника. 1 с координатами точек: (0,0) ; (3,0) ; (3;2). Второй треугольник: (6,3) ; (5,3) ; (6,4). К сожалению не могу выложить картинку , так бы было более понятно. В координатной плоскости XY 2 треугольника, отдельных друг от друга пространством. Другими словами- 2 совершенно самостоятельных треугольника. Задача- по координате , вычислить -входит ли точка в заштрихованную область( внутренняя область треугольников ) . Надо рассматривать 2 треугольника, и записывать для каждого своё уравнение, которое будет проверять на пренадлежность точки, или же анализировать координатами ( if X>0 and Y ... ) -но это уже явно сложнее.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #4 : 27-09-2006 18:56 » |
|
Прочитай мой пост. Для треугольника в лоб ты не сможеш опредилить вхождение. Надо искать другие пути.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
FallenSoul
|
|
« Ответ #5 : 28-09-2006 02:05 » |
|
Отсекая области, противоречащие координатам по Х и У , получились. 2 прямоугольника, включающие в себя по треугольнику. С прямоугольниками было бы просто а вот как поступить с треугольниками? :\
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #6 : 28-09-2006 05:53 » |
|
Для розыска точки пересечения отрезка с выпуклым многоугольником, бывает, используют алгоритм Кируса-Бека. Идею метода определения факта нахождения точки внутри выпуклого многоугольника можно почерпнуть из этого алгоритма.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Sands
Помогающий
Offline
|
|
« Ответ #7 : 28-09-2006 08:36 » |
|
Мы в свое время использовали векторное произведение для определения находится точка внутри фигуры или вне. Для треугольника там вообще просто и операций немного выходит. Суть: последовательно находим векторное произведение векторов, которые создаетя с двумя соседними вершинами данная точка и если результирующий вектор направлен вверх по отношению к данной плоскости, то угол меджу начальными векторами добавляем к сумме углов, а если сниз, то вычитаем. Ну а потом рассматриваем варианты суммы. Там осталось сделать 1 шаг. Подумай маненько, ежели будет совсем невмоготу - пиши, продолжим...
|
|
|
Записан
|
|
|
|
FallenSoul
|
|
« Ответ #8 : 28-09-2006 10:17 » |
|
Да всё намного проще, спасибо за помощь.
Сегодня ехал в транспорте, и вот что я обнаружил (=
Имеется прямая, проходящая через начало отсчета и точку с координатами (3,2). Из уровнения прямой, y = kx , я вывел зависимость Y от Х- это y= 2x\3 .Оба треугольника не имеют общих координат по Х или Y => отсекаем промежуточные области между треугольниками, и всё что за пределами этих треугольников( x>5 , x<0 , 3<=x<=5 , y>5 , y<0 ... ). Тем самым на чертеже остаются только 2 области - 2 прямоугольника, включающие в себя по треугольнику. Далее, с помощью отсеченных областей и уровнения прямой, можно вывести и само решение. y<=2x\3 а также x и y не входят в области, лежащие за пределами треугольника. => из 2ух треугольников, составляющих прямоугольник , y<=2x\3 будет обозначать все точки нижнего( а он то мне и нужен ). Х определен, Y вычисляется-ничего лишнего. Аналогично и со вторым треугольником. Всё просто, всё реально =)
Надосуге напишу код ,-если будет кто не сильно занят-просьба войти, посмотреть... Всем спасибо.
п.с. А 6 вариант просто ппц ... ( В центре дан прямоугольник,-написать для всего, что не входит в прямоугольник. ( if x>3 => True, if x<0 => True, if y>5 => True, if y<1 => True. Готово. Эх...).
|
|
|
Записан
|
|
|
|
Sands
Помогающий
Offline
|
|
« Ответ #9 : 28-09-2006 11:12 » |
|
Если честно, не совсем согласен с твоей радостью, FallenSoul, ибо ты решил задачу при твоих конкретных условиях, а они у тебя почти тривиальные, ибо оба треугольника (если я правильно себе представляю) являются прамоугольными с катетами, которые паралельны осям координат. А что будет с твоим алгоритмом ежели треугольники будут произвольными да еще с какими-нибудь веселыми вершинами. Или к примеру вершины треугольников надо будет вводить с клавиатуры? Тогда тебе придется во первых решать систему уравнений(причем не одну), а во вторых корректно выписывать все if-ы которые оконтурят твою область. Попробуй решать задачу более общно, чтоб не было мучительно больно за бесцельно прожитые годы, когда окажется, что в большей части случаев твой алгоритм работает некорректно.
|
|
|
Записан
|
|
|
|
FallenSoul
|
|
« Ответ #10 : 28-09-2006 13:00 » |
|
У меня за спиной, 3 лекции по С++, 10 уроков с вашего сайта и ничего более. Я бы и рад, да не имею в данный момент никакой возможности :\ Со временем...
|
|
|
Записан
|
|
|
|
Sands
Помогающий
Offline
|
|
« Ответ #11 : 28-09-2006 13:13 » |
|
Скажу тебе по секрету, что для построения нормального алгоритма знание языка стоит отнюдь не на 1 месте, для того алгоритма который предложил я надо знание простейших арифметических операций ну и пару функций, изучение которых будет только плюсом для тебя. Единственная загвоздка - ето то, что ты можешь еще не знать что такое векторное произведение. Но зато когда ты все найдешь и сделаешь, гордости будет!!! Мы вот на первом курсе вообще писали рекурсивные кривые (фракталы), а во втором семестре - калькулятор-интерпретатор. Так что не дрейфь, а читай хелпы и юзай форум!
|
|
|
Записан
|
|
|
|
FallenSoul
|
|
« Ответ #12 : 28-09-2006 13:32 » |
|
10 уроков. Как дальше продолжить постепенное изучение ? Читать какие попало статьи , не лучше решение...
2Вопрос один возник. Как зделать следующий отрывок: Обозначить вторую функцию, и использовать её в коде главной(main) , например:
Если условие такое -то выполняется => запуск функции , которая выдаёт на экран: "Точка не входит" иначе ...
|
|
|
Записан
|
|
|
|
Sands
Помогающий
Offline
|
|
« Ответ #13 : 28-09-2006 13:58 » |
|
делается ето приблизительно следующтм образом: #include <stdio.h>
void MyFunc(); // обьявляем прототип функции
int main() { ........ // делаем действия которые должны пройти перед проверкой условия if(<условие>) { Myfunc(); } else { ..... // делаеш то, что у тебя зашито в троеточии } ...... // выполняешь еще какие-то действия, которые должны идти после проверки условия и являются общими для всей програмы return 0; // завершаеш работу }
// реализация функции MyFunc()
void MyFunc() { printf("Точка не входит");
}
причем вместо <условие> надо поставить то условие которое ты хочешь. И я бы тебе советовал начать читать Керниган Ричи "Язык С" или Страуструпа точно не скажу как называется книга, но что-то типа полное руководство по С++
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #14 : 28-09-2006 14:10 » |
|
Коротко:
1. Задача не является программной - теюе постановка вопроса относится к геометрии за 5-6-й классы, к программиррованию никак не относится.
Необходимо с базы высшей математики, или школьной геометрии (зависит от задачи и от желания и знаний) решить, как будет находится признак принадлежности. Т.е. надо было формульно вывести решение задачи для произвольной фигуры, и для точки. Потом просто внести алгоритм в программу. Все.
2. По поводу уроков. После 10 уроков с сайта и после начала лекций надо бы просто использовать неплохой борландовский Хелп вшитый в сам компилятор и среду 3.11 Я именно так начинал, т.е. брал задачку и решал ее. Например написать простенький графический редактор. Написать вычисление интегралов простейших. Написть игру в виде тетриса или еще чего простого.
В общем ставить задачу и решать. Вопросы по решению тех или иных проблем можно будет задавать тут и получать правильные решения и ответы. К концу курса при желании будешь знать все - на уровне начинающего программера на С++. потом можно будет пойти на кафйедру и попросится программером. Дабы решать реальные задачи в реальном коллективе и для реальных людей. К пятому курсу получится вполне симпатичный коллега, по крайней мере подход к вопросам мне понравился.
Удачи - студент!!!
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
FallenSoul
|
|
« Ответ #15 : 28-09-2006 16:05 » |
|
Код практически готов. Остались последние штрихи, + ваши комментарии. Несколько вопросов:
1. Как забить код в буфер обмена 2. Как оформить русский язык в Borland C++ 3.1, и если он не установлен-что надо сделать. Брал болванку на которой лежала эта среда-скопировал себе на жесткий диск, прописал PATH, а с русским не лады :\
|
|
« Последнее редактирование: 28-09-2006 16:27 от FallenSoul »
|
Записан
|
|
|
|
Sands
Помогающий
Offline
|
|
« Ответ #16 : 28-09-2006 16:32 » |
|
1 Что значит "Забить код в буфер обмена"? 2. Если мне не изменяет память, то русский там не сильно предусмотрен особенно в полях PATH. И опиши проблему подробнее, если не тяжело. 3. Попробуй при всех числах с плавающей точкой поставить .0, тоесть 1.0, 2.0, 3.0, а заодно проверь нет ли у тебя обьявления переменных x,y где-нибудь еще в виде int x,y. Потому что результат очень напоминает целочисленное деление.
|
|
|
Записан
|
|
|
|
FallenSoul
|
|
« Ответ #17 : 28-09-2006 16:38 » |
|
Я убрал 3ий пункт из вопроса, потому что на самом деле y<=(x*2)/3 при х =2 и у =1 . После 20 минут подсчётов, я всё таки согласился с компьютером )
Что касается 2ух других вопросов: 1. Ctrl +C -> Копировать ... Как мне извлечь код из среды C++, для дальнейшей вставки предположим в том же .тхт или ворде-или надо спец. сохранять с расширением, или открывать .CPP файл текстовым редактором? 2. Русский язык. -Не могу писать комментарии русским языком,-хоть с английским проблемм особых нет, но не всё однако могу объяснить и не все мои комментарии сможет понять другой человек. Я хотел бы узнать,- возможно там специфическая раскладка смены языка, или же надо добавить\заменить какие-то файлы в корневом каталоге, чтобы был доступен русский язык в среде программирования. ?
|
|
« Последнее редактирование: 28-09-2006 16:41 от FallenSoul »
|
Записан
|
|
|
|
Sands
Помогающий
Offline
|
|
« Ответ #18 : 28-09-2006 16:47 » |
|
Извлечь код из среды ты никак не сможешь - буфера разные, посему надо открывать твой cpp-шник Блокнотом или Вордом, как понравится. Оносительно написаний комментариев на русском языке - с етим у них траблы, посему единственный вариант для тебя - писать комментарии транслитом. По идее мы когда-то пытались заставить паскаль работать с рускими шрифтами, но дело ето неблагодарное, да и при открытии их под Виндой все камменты превращались в "арабскую вязь" , посему пиши транслитом ла и учи англицкий - без него тяжковато потом будет MSDN почитывать
|
|
|
Записан
|
|
|
|
Sands
Помогающий
Offline
|
|
« Ответ #19 : 28-09-2006 17:14 » |
|
А теперь ложка дегтя: 1 Прототипы функций нельзя описывать как переменные, по идее у тебя компилятор должен был выдать ошибку на строку void True(),False(); стоило бы записать так: void True(); void False(); 2. Правильно все-же писать "OK", а не "oke" 3 Проверь свою программку при х==5.5 у==1 если я правильно понимаю, то ни в один из треугольников точка не вписывается. А что выдаст программа?
|
|
|
Записан
|
|
|
|
Sands
Помогающий
Offline
|
|
« Ответ #20 : 28-09-2006 17:18 » |
|
И не обижайся если чего не так сказал. На самом деле, если ты расщитывал на внеземные похвалы, то такое маловероятно ибо ведет к зазнанию и ленивости, а как результат - отсутствие должных знаний. Однако, как видиш, и пинать тебя до смерти никто не стал. А опыт как известно "сын ошибок трудных". И кстати, на достигнутом тормозить не стоит. Бери новые задачи, разрабатывай алгоритмы, пиши проги. Однако настоятельно советую, довести до ума алгоритм для данной задачи.
|
|
|
Записан
|
|
|
|
FallenSoul
|
|
« Ответ #21 : 28-09-2006 17:21 » |
|
Какие похвалы и пинки. Брось,- я выложил сюда код чтобы окончательно разобратся с написанным, и благодаря вашим комментариям оформить так как надо, чтобы в дальнейшем знать как всё делается грамотно. Чем больше поправок на начальном этапе, тем лучше! Несказав про х=5.5 , у=1 -алгоритм считался бы не верным , и у меня была бы иллюзия.
А что касается 5.5 , 1-и в самом деле программа выдаёт положительный результат, хотя на практике это ложно :\ хм...
|
|
|
Записан
|
|
|
|
FallenSoul
|
|
« Ответ #22 : 28-09-2006 17:28 » |
|
Думаю , последним штрихом будет исключение еще одной области: if(x>3 && y<3) { False(); return 0; }
Однако я прекрасно понимаю, что все что написано выше-это частный случай и что надо задавать общие формулы для все возможных случаев,- проблемма только в том что я не имею представления каким уравнением и какими функциями можно это осуществить( в геометрии и мат. анализе ).
|
|
|
Записан
|
|
|
|
Sands
Помогающий
Offline
|
|
« Ответ #23 : 28-09-2006 17:35 » |
|
Читай посты выше, в частности мой, в которых приводятся намеки на алгоритмы, тебе ж их не зря писали. Опять же интернет есть, и поисковики слава богу существуют. Поищи ссылки на алгоритмы. Заодно можеш сходить на algolist.manual.ru И потом уже спрашивай чего неясно. Причем думать что все алгоритмы будут для треугольника - наивно, все они будут приводится обобщенно для многоугольников.
|
|
|
Записан
|
|
|
|
LP
Помогающий
Offline
|
|
« Ответ #24 : 29-09-2006 16:20 » |
|
FallenSoul, я здесь как-то выкладывал функцию для определения принадлежности точки треугольнику, но ту тему кажется удалили (она была в разделе СРОЧНО ПАМАГИТЕ!!!).
Есть книга: Майкл Ласло "Вычислительная геометрия и компьютерная графика на C++", в ней описан другой, по-моему, самый удачный алгоритм решения этой задачи. Книгу можно скачать на natahaus.ru или как уже сказали смотри algolist.manual.ru - там есть тот самый отрывок из этой книги.
|
|
|
Записан
|
Если эта надпись уменьшается, значит ваш монитор уносят
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #25 : 29-09-2006 16:28 » |
|
LP, я помню смысл решения - сумма площадей трёх треугольников (образованных точкой и тремя вершинами) должна быть == площади исходного тр-ка
|
|
|
Записан
|
|
|
|
LP
Помогающий
Offline
|
|
« Ответ #26 : 29-09-2006 18:06 » |
|
Я тоже помню, просто заново писать лень. Лучше взять готовое с algolist'a, тем более что в том способе учитывается, например, случай когда точка лежит на стороне треугольника и т.д.
|
|
« Последнее редактирование: 15-12-2007 15:05 от Алексей1153++ »
|
Записан
|
Если эта надпись уменьшается, значит ваш монитор уносят
|
|
|
FallenSoul
|
|
« Ответ #27 : 30-09-2006 19:25 » |
|
Спасибо.
Сейчас решил написать небольшую програмку, которая будет осуществлять действия над матрицами,-однако с самого начала уже возник вопрос. Как оформить ввод координат с клавиатуры командой "cin" в строку? Допустим:
x11= ввод значения x12= ввод значения х13= ввод значения ... х12= ввод значения ... ...
Дело в том , что по стандартной схеме cin>>x11>>x12... -каждое значение вводится с новой строчки :\
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #28 : 30-09-2006 19:55 » |
|
FallenSoul, вводи через запятую каждую строчку
или курсор переводи назад
|
|
|
Записан
|
|
|
|
FallenSoul
|
|
« Ответ #29 : 30-09-2006 20:19 » |
|
В уроках такого не видел, можно краткую справку по обоим пунктам?!
|
|
|
Записан
|
|
|
|
|