Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2016, 06:22   #1
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию Найти длины отрезков

Всем привет.
Есть следующая задача:
дана плоскость размером 640x464 точек, через которую проведена боковая диагональ (из правого верхнего в левый нижний угол); так же дана точка с произвольными координатами x и y (которые известны).
Требование: провести линию, которая будет параллельна диагонали, и будет проходить через данную точку.

На иллюстрации требуемая линия - C, описанная точка - пересечение отрезков A, B и C, имеет координаты (x=108,y=182) - взято в качестве примера. Что бы провести линию C, нужно получить её начальную координату X и конечную координату Y.
Первая равна 640-A, вторая - 464-B.
Вопрос: как найти длины отрезков A и B ?


https://pp.vk.me/c630716/v630716413/...X12kRJkSPo.jpg
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 24.05.2016, 06:49   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Уравнение диагональной прямой сделай и находи по нему y для x=108 и x для y=182. Учти, что в этой плоскости ось x сверху вниз направлена

ADD упс, ось y вниз, а не х
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 24.05.2016 в 08:31.
Аватар вне форума Ответить с цитированием
Старый 24.05.2016, 09:16   #3
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Аватар
Возможно, я не очень разбираюсь, а что такое это "уравнение диагональной прямой" ?
Я могу сделать два списка зависимостей, в первом будут расстояния от нуля до диагонали по оси Y для заданной X, а во втором - с точностью наоборот. Но тогда у меня в первом списке будет 640 зависимостей, во втором 464. Прописывать их все как то не комильфо. А формулу зависимости я просто не знаю.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 24.05.2016, 09:26   #4
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
Аватар
Возможно, я не очень разбираюсь, а что такое это "уравнение диагональной прямой" ?
Код:
y = ax + b
это математика 5 класса

a — тангенс наклона линии, будет такой же, как и у исходной диагонали; b найдутся через точки; ну и отрезки уже не сложно будет посчитать.
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 24.05.2016, 10:02   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Можно без вычислений тангенса. Там уравнение через две точки:
-(y-464)/464=x/640 ->
y=-(x*464/640)+464
x=-(y-464)*640/464
и находи из них
Цитата:
y для x=108 и x для y=182
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 24.05.2016 в 10:33.
Аватар вне форума Ответить с цитированием
Старый 24.05.2016, 11:41   #6
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Я замутил другой способ, и я сейчас опишу его.
Можно пробовать находить длину меньшего основания трапеции (показано на следующем рисунке), тогда искомое значение будет будет равно lsot - T(c), где lsot - длина меньшего основания трапеции, T - заданная точка, с - зависимая координата точки.


https://pp.vk.me/c630719/v630719413/...y0U0le-5XM.jpg

На изображении пара отрезков A и A0 в сумме дают меньшее основание первой трапеции, B и B0 - второй трапеции.
Угол d можно получить по соответствующей формуле треугольника, и этот угол понадобится в формуле основания трапеции. Для второй трапеции угол свой (забыл дорисовать).
Руководствуясь формулами прямоугольной трапеции и прямоугольного треугольника можно получить все необходимые значения.

Но как бы не так, если у меня бы всё получилось - сюда бы я не стал писать. Ручной расчёт в радианах показывает, что длина отрезка A+A0 равна 325 пикселей, при указании углов, как градусов длина того же отрезка равна 508 пикселей, а программа мне насчитала 433 пикселя. На деле же можно в paint увидеть, что длина этого отрезка равна 388 пикселей. Код программы нет смысла проверять, пока ручные расчёты не покажут правильные результаты.
Откуда такая аранжировка значений - я, мягко говоря, не понимаю.
Где я ошибся ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 24.05.2016, 11:50   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
procedure TForm1.PaintBox1Paint(Sender: TObject);
var MaxX,MaxY,x,y: Integer;
begin
  MaxX:=640; MaxY:=464; x:=108; y:=182;
  //PaintBox1.Width:=MaxX;
  //PaintBox1.Height:=MaxY;
  PaintBox1.Canvas.MoveTo(0,0);
  PaintBox1.Canvas.LineTo(MaxX-1,0);
  PaintBox1.Canvas.LineTo(MaxX-1,MaxY-1);
  PaintBox1.Canvas.LineTo(0,MaxY-1);
  PaintBox1.Canvas.LineTo(0,0);

  PaintBox1.Canvas.MoveTo(0,MaxY-1);
  PaintBox1.Canvas.LineTo(MaxX-1,0);

  {ниже собственно то, что нужно нарисовать}
  PaintBox1.Canvas.MoveTo(0,Round(MaxY-(-(x*MaxY/MaxX)+MaxY-y)));
  PaintBox1.Canvas.LineTo(Round(MaxX-(-(y-MaxY)*MaxX/MaxY-x)),0);
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.05.2016, 14:06   #8
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Можно без вычислений тангенса. Там уравнение через две точки:
-(y-464)/464=x/640 ->
y=-(x*464/640)+464
x=-(y-464)*640/464
и находи из них
-464/640 это и есть тангенс
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 24.05.2016, 14:16   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
-464/640 это и есть тангенс
Конечно. Наверно имел в виду без явного упоминания. А он все равно туточки. Может и ТС не в курсе, уравнение прямой не знает же
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.05.2016, 17:49   #10
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Аватар
По вашей формуле X рассчитывается правильно (279 для моего примера), Y рассчитывается не правильно - для моего примера 202, а получается 442.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти квадрат длины веревки bmxsavo Общие вопросы C/C++ 0 21.05.2014 14:07
Ассемблер. Найти слово минимальной длины и укоротить остальные слова до длины минимального. xqr Помощь студентам 1 25.05.2012 22:41
Даны длины отрезков a,b,c,d,e.Выяснить,можно ли построить треугольник со сторонами {a,b,c},{b,c,d},{c,d,e}?Если да,то найдите пло kazbek1 Паскаль, Turbo Pascal, PascalABC.NET 6 18.05.2012 21:15
Найти длины векторов Pascal GaJIbI4 Помощь студентам 3 28.12.2011 21:17
Нужно найти координаты точки пересечения двух отрезков в пространстве... Dima6120 Мультимедиа в Delphi 2 30.07.2010 13:36