Чтобы наиболее наглядно показать как стоит проводить вычисления я буду вводить координаты начала и конца отрезка с клавиатуры.
Код C++ Рисование отрезка
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <stdlib.h> #include <iostream.h> #include <graphics.h> void main() { system("CLS"); int gdriver=DETECT,gm; initgraph(&gdriver,&gm,""); //Инициализация графического режима int x1,y1,x2,y2; //Координаты начала и окончания отрезка cin>>x1>>y1; //Ввод координат точки начала cin>>x2>>y2; //Ввод координат точки конца line(x1,y1,x2,y2); //Чертим отрезок по заданным параметрам system("PAUSE"); closegraph(); //Заканчиваем работу в графическом режиме return; } |
Собственно, это программа построения отрезка по координатам начала и конца. Бывает, что дальнейшее написание программы требует узнать длину выбранного отрезка для следующих вычислений и дальнейшего построения. Вот тут к нам на помощь приходят знания, данные нам Пифагором
Напомню теорему. Сумма квадратов катетов равна квадрату гипотенузы. (a²+b²=c²)
Не имея достаточно опыта, я иногда выполняю дополнительные построения, чтобы убедится в правильности. Вот при моем знакомстве с вычислением длин отрезков — я достаточно часто прибегал к программному построению дополнительных линий, которые очень наглядно показывали, что в большинстве случаев мои предположения относительно позиций разных точек были ошибочны. Поэтому в этом материале я точно также использую подход с дополнительными построениями.
Итак. Чтобы можно было провести выбранный расчет — нам нужен прямоугольный треугольник. Чтобы знать хоть какие-то размеры, нам нужны отрезки параллельные осям.Честно говоря — с одной стороны то что я сейчас напишу лишний шаг, но с другой стороны он может быть кому-то полезен. Ниже будет более нужное относительно этой статьи.
Для начала из выбранной нами точки проведем линию на ось y, после чего проведем на ось y
Код C++ Построение катетов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#include <stdlib.h> #include <iostream.h> #include <graphics.h> void main() { system("CLS"); int gdriver=DETECT,gm; initgraph(&gdriver,&gm,""); //Инициализация графического режима int x1,y1,x2,y2; //Координаты начала и окончания отрезка cin>>x1>>y1; //Ввод координат точки начала cin>>x2>>y2; //Ввод координат точки конца line(x1,y1,x2,y2); //Чертим отрезок по заданным параметрам setcolor(1); //Меняем цвет для наглядности line(x1,y1,x1,y2); //Вертикальный катет line(x1,y2,x2,y2); //Горизонтальный катет system("PAUSE"); closegraph(); //Заканчиваем работу в графическом режиме return; } |
Изменения совсем незначительны, но этот момент лично мне пока еще доставляет некоторые неудобства. Хорошо если вы умеете представлять декартову плоскость и ориентируетесь в ней как рыба в воде, но для таких как я — само построение катетов в нужном месте сразу не получается. В принципе важно не место где они будут находится, важен только их размер, но некоторый практический навык можно получить занимаясь изучением такого простенького построения.
Теперь сконцентрируемся на самом нужном. На самом деле, узнать размеры этих катетов очень просто. Как я писал, они являются параллелями осей.
Общая формула для получения их длин
katet1=abs(x1-x2) //Длина горизонтального
katet2=abs(y1-y2) //Длина вертикального
следовательно длина изначально построенного отрезка равна длине гипотенузе показанного ранее треугольника.
gipotenuza=sqrt(katet1²+katet2²)
Полагаю найдутся читатели, заинтересованные во всем этом, но если я не допишу кода, то среди них могут найтись такие, кому тяжело совмещать теорию с практикой., даже если эта теория как два пальца об асфальт. Поэтому показываю кодом
Код С++ Узнать размер отрезка
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#include <stdlib.h> #include <iostream.h> #include <graphics.h> void main() { system("CLS"); int gdriver=DETECT,gm; initgraph(&gdriver,&gm,""); //Инициализация графического режима int x1,y1,x2,y2; //Координаты начала и окончания отрезка cin>>x1>>y1; //Ввод координат точки начала cin>>x2>>y2; //Ввод координат точки конца line(x1,y1,x2,y2); //Чертим отрезок по заданным параметрам setcolor(1); //Меняем цвет для наглядности line(x1,y1,x1,y2); //Вертикальный катет line(x1,y2,x2,y2); //Горизонтальный катет //УЗНАЕМ РАЗМЕРЫ КАТЕТОВ double katet1=abs(x2-x1); double katet2=abs(y2-y1); //РАСЧЕТ ДЛИНЫ ЗАДАННОГО ИЗНАЧАЛЬНО ОТРЕЗКА double gipot=sqrt(katet1*katet1+katet2*katet2); cout<<gipot/5.2; //Пояснение ниже system("PAUSE"); closegraph(); //Заканчиваем работу в графическом режиме return; } |
Видно, что есть момент с комментарием: пояснение ниже. Поясняю. Чтобы как-то можно было измерить и убедится в верности расчета, хотелось бы измерять по линейке. На экране минимальная единица измерения это пиксель. Пиксель это одна точка, но в то же время это квадрат, который имеет свою длину. При этом в зависимости от экранов длина пикселя может быть различна. Но чтобы перевести размеры в нашу систему и получить их в миллиметрах, нужно знать эту самую длину пикселя.
Часто бывает так в программировании, что что-то требуется подгонять. Вот я и решил, что стоит провести небольшой расчет. Измерил линейкой длину досовского окошка, разделил getmaxx() на этот размер, получил некоторое число. Точнее говоря у меня вышло 5.
Длина моего дос окна = 122мм
getmaxx()/122=5;
Короче говоря — это арифметика из 5 класса средней школы для получения единицы измерения. Измеряя по линейке результаты расчетов длин, у меня вышло приблизительно, но неточно и я методом подбора пришел к числу 5.2
Может кто-то хочет знать природу этого числа в моем коде, вот поэтому я расписал. Вообще, если подумать, то подобный метод расчета может помогать достаточно часто/
Еще хотелось бы обратить внимание на типы переменных. Изначально я задал катеты как int, но вычисления так происходили неверно. Это тот случай когда я получил капельку лишнего опыта, увидев свое срабатывание. Когда я ищу ошибки в своих программах — то чаще просто вывожу переменные на экран, например с помощью cout, изначально так привык. Так вот попытка написать сout<<katet1*katet1<<«+»<<katet2*katet2<<«=»<<katet1*katet1+katet2*katet2
выводила мне не те данные, что я ожидал при своих значениях. Вроде я умножаю два числа и не присваиваю их никуда, то думать о переполнении как-то лень. Но на самом деле изначально задав целочисленный тип int этим катетам и в результате умножения, результат записывается тоже в int., даже если нет планов запоминать результат в отдельную переменную. Кто-то скажет — это же элементарно, но признаюсь честно: «До сих пор я этого не знал», поэтому получил переполнение и неожиданные для себя результаты.
Будьте внимательнее меня.
Добавить комментарий