![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
DIMMUA |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 10 Пол: Мужской Реальное имя: Дмитрий Репутация: ![]() ![]() ![]() |
Добрый день... У меня возникла маленькая неприятность, оказывется я не знаю как провести линию через две точки на весь экран. Т.е. я знаю как соеденить две точки линией и т д... Ну вот чтобы провести линию через эти две точки на весь экран я не знаю как это сделать. Может есть какая-то легкая процедура и т.д.?
К примеру: есть А(100,100) и B(200,200) - нужно провести через них линию И еще, я так увлекся "украшательством" своей программы, что забыл про свое условие, короче у меня оврал, помогите: Есть уравнение прямой, есть две точки, прямая разбивает плоскость на подплоскости, нужно опеределать лежат ли эти две точки в разных. Уранение прямой разное, в общем виде: sx+ty+u=0 и точки (a,b) и (c,d). Т.е. a,b,c,d,s,t,u вводятся с клавиатуры. Я прикрепил свой исходник.... Он еще не полность доделал... Немного о нем расскажу, чтобы было понятно: точки А,Б - обычные точки (вводите их около плюс-минус 10) точки X1 и X2 - точки из прямой, т.е. это две точки принадлежащие этой прямой. "Новые данные" - это идет "переработка" под вывод этих точек на координатной плоскости, например точка А(-2;1) - это А(280;220) - ну если учесть, что у меня точка (320;240) это центр, а одна "еденица" - это 20 пикселей. Вообщем я должен построить прямую на весь экран, которая проходит через точки X1 и X2 и потом опередалеть лежит ли точки А и Б в одной подплоскости. P.S. Если я что-то непонятно написал, вы спрашивайте... Сообщение отредактировано: DIMMUA - Прикрепленные файлы ![]() |
мисс_граффити |
![]()
Сообщение
#2
|
![]() просто человек ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: ![]() ![]() ![]() |
может, будет полезно
типы данных: type алгоритмы: procedure InitLine(var L: TLine; pA,pB: TPoint); первая - создание линии по точкам вторая - "знак" точки (как раз в какой полуплоскости лежит) -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
Michael_Rybak |
![]()
Сообщение
#3
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: ![]() ![]() ![]() |
Если тебе не обязательно делать всё по-честному, можешь существенно выйти за пределы экрана.
Чтобы провести прямую, соединяющую точки Х1 и Х2, продли отрезок Х1-Х2 тысячекратно в обе стороны: X1 + (X1-X2) * 1000 -> X2 + (X2-X1) * 1000 Понятно, что экран полностью пересечется. Что касается вопроса про точки А и Б - нужно проверить, что ориентированные площади треугольников Х1Х2А и Х1Х2Б имеют одинаковый знак: def OrientS(a, b, c) = (a.x-c.x)*(b.y-c.y) - (a.y-c.y)*(b.x-c.y) return sign(OrientS(Х1, Х2, А)) = sign(OrientS(Х1, Х2, Б)) |
DIMMUA |
![]()
Сообщение
#4
|
Новичок ![]() Группа: Пользователи Сообщений: 10 Пол: Мужской Реальное имя: Дмитрий Репутация: ![]() ![]() ![]() |
Спасибо, что ответили, кое что прояснилось... Правда я не все понял
![]() мисс_граффит это сильно сложно для меня, не мой уровень так сказать... Michael_Rybak прочитал про ориантированную площадь треугольника, поискал в Инете, нашел такую формулу (твоя мне показалась сложной): Ориентированная площадь S треугольника с вершинами P1, P2, P3: . . . . | x1 y1 1 | S = 1/2 | x2 y2 1 | = 1/2*[x1(y2-y3)+x2(y3-y1)+x3(y1-y2)] . . . . | x3 y3 1 | (точки поствил, что бы не смещалось) У меня допустим точки P1, P2 - это точки X1 и X2, а в P3 я подставляю точку А и потом точку B. Попробовал, вроде все работает, если точки в разных подплоскоятх, то площади отличаются знаком. Но вот насчет "продления" я не понял как это сделать.... Меня впринципе не интересует, где будут концы этого отрезка, главное чтобы он пересек экран (для наглядности). Можешь написать формулу продления отрезка более доходчиво для меня. Сообщение отредактировано: DIMMUA - |
Lapp |
![]()
Сообщение
#5
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
DIMMUA, ты выбрал не очень удачные названия точек, Х1 и Х2.. Можно я буду называть их M и N?
Так вот, предложение Michael_Rybak'а заключается в следующем.. Точки как бы представлены векторами, проведенными к ним из начала координат, назовем эти вектора так же, M и N. Тогда разность этих векторов представит сам отрезок: а=M-N - вектор от точки N к точке M. b=N-M - наоборот. Рыбак предлагает умножить этот отрезок на 1000 и отложить, что получится, в обе стороны (продлить). Тогда мы получим новые две точки, назовем их K и L : K = M + а*1000 L = N + b*1000 Если расписать это все в координатах, получим: Kx = Mx + (Mx-Nx)*1000 Ky = My + (My-Ny)*1000 Lx = Nx + (Nx-Mx)*1000 Ly = Ny + (Ny-My)*1000 Вот эти точки и соединяй оператором Line. Теперь понятнее? P.S. DIMMUA, спасибо тебе за нормальную подробную постановку задачи с объяснениями и вежливый человеческий тон. Душа отдыхает в такой теме.. Просто хочется отвечать! ![]() Добавлено через 4 мин. Хочу добавить, что мне метод Рыбака не очень по душе.. Так можно запросто вылететь за пределы диапазона целых чисел. Я бы предложил все же находить точное пересечение линии с границей экрана.. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
DIMMUA |
![]()
Сообщение
#6
|
Новичок ![]() Группа: Пользователи Сообщений: 10 Пол: Мужской Реальное имя: Дмитрий Репутация: ![]() ![]() ![]() |
Lapp Спасибо! Все понял, даже получилось, скоро все доделаю, может еще что-то "красивее" сделаю и выложу исходник, может кому-то понадобится.
Щас правда как-то примитивно постараюсь ограничить, чтобы моя прамая не сильно вылазила за пределы экрана, а то и впраду за ошибку выдаст в самый неподходящий момент. |
DIMMUA |
![]()
Сообщение
#7
|
Новичок ![]() Группа: Пользователи Сообщений: 10 Пол: Мужской Реальное имя: Дмитрий Репутация: ![]() ![]() ![]() |
Программа получилась, все работает... В данный момент занимаюсь украшательством. Хотел сказать, что мне для выполнения этой задачи графика не нужна была, мы её в универе еще не изучали, поэтому у меня было столько вопросов. Кстати, а как вывести значение переменной на экран в графическом режиме? Например:
А(а;b) - и вот я пишу OutTextXY(10,10, ' A(',a,';',b,')'); - т.е. по типу как "writeln" - а оно выдает ошибку, я так понимаю этой функцией можно только текст вывести? А какже тогда вывести значение какой-то переменной? Пробовал writeln - вообще не видно, что оно выводит, т.е. вроде как вывело, но ничего не видно. Пробовал менять цвет текста - ничего, правда в текстовом режиме цвет изменился. P.S. Моя программа, наслаждайтесь... Знаю, для многих она покажется легкой, но для меня ![]() Фичи ![]() 1. Проверка пароля... и заметте вы не видите сам пароль при вводе. (пароль 1234567890) 2. Сделал ограничение, чтобы моя прямая не сильно вылазила за пределы экрана... т.е. я "умножаю" отрезок до тех пор, пока все вершины не скроются с экрана... Т.е. таким способом я врятли выйду за пределы integer. 3. В конце выводит время выполнения кода (кстати, взято с вашего сайта ![]() Прикрепленные файлы ![]() |
Michael_Rybak |
![]()
Сообщение
#8
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: ![]() ![]() ![]() |
Для вывода используй TextOut или OutText, уже не помню, как в Паскале.
Что касается выхода за диапазон - можно не умножать на 1000, а умножать на 2 до тех пор, пока за экран не выйдем. Так точно останемся в Integer. |
DIMMUA |
![]()
Сообщение
#9
|
Новичок ![]() Группа: Пользователи Сообщений: 10 Пол: Мужской Реальное имя: Дмитрий Репутация: ![]() ![]() ![]() |
Для вывода используй TextOut или OutText, уже не помню, как в Паскале. Что касается выхода за диапазон - можно не умножать на 1000, а умножать на 2 до тех пор, пока за экран не выйдем. Так точно останемся в Integer. OutText или OutTextXY - это вывод обычного текста, а мне нужно вывести значение переменной. Например а=2, я пишу: OutTxet('a = ',a) - но паскаль выдает ошибку, он предлагает сделать OutText('a = '), т.е. я не могу вывести "а = 2" в графичеком режиме, а если написать writeln('a = ',a) - то этой надписи не видно (в графическом режиме). Насчет выхода из диапазона я сделал так: новые точки:=исходные*2 - если после этого, хоть одна точка остается в пределах экрана, то новые точки:=исходные*3 - т.е. сначла пробую умножать на 2, потом на 3 и т.д.... Сообщение отредактировано: DIMMUA - |
Michael_Rybak |
![]()
Сообщение
#10
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: ![]() ![]() ![]() |
OutText или OutTextXY - это вывод обычного текста, а мне нужно вывести значение переменной. Например а=2, я пишу: OutTxet('a = ',a) - но паскаль выдает ошибку, он предлагает сделать OutText('a = '), т.е. я не могу вывести "а = 2" в графичеком режиме, а если написать writeln('a = ',a) - то этой надписи не видно (в графическом режиме). Тогда переведи значение переменной в строку с помощью процедуры Str, и потом юзай OutText. Насчет выхода из диапазона я сделал так: новые точки:=исходные*2 - если после этого, хоть одна точка остается в пределах экрана, то новые точки:=исходные*3 - т.е. сначла пробую умножать на 2, потом на 3 и т.д.... Ага, молодец. Так тоже можно, просто лучше, имо, коэффициент увеличивать не линейно (2, 3, 4, 5, ..) а экспоненциально (2, 4, 8, 16, 32 ...) - быстрее вылезешь за экран ![]() |
![]() ![]() |
![]() |
Текстовая версия | 7.06.2023 12:21 |