Программа расстояние между двумя точками

Содержание

А вот что написал знающий товарищ (tym32167, далее его текст):
Когда вы пишете программу, пишете код, то требования к качеству кода, стилю и структуре могут различаться, в зависимости от многих факторов. Это как писать художественное произведение — если вы пишете короткий рассказ, то вам можно не беспокоиться о вселенной, где обитают персонажи, о мотивации каждого из них и прочих вещах. Если же вы пишете большой труд, то вам придется предусмотреть всё, законы вымышленного мира, события, которые в этом мире будут пересекаться, разные части вашего произведения будут тесто переплетены и общая сложность произведения увеличится.

Попробую пояснить это подробней. Если вы не планируете развивать приложение, то есть тот код, что вы прислали — это конечный вариант и у вас никогда не будет необходимости вносить в него изменения, то все в порядке, ваши несколько строчек кода вполне сгодятся. Такое бывает если вы решаете курсовую или просто тренировочную задачку.

Теперь давайте представим, что мы пишем часть огромной корпоративной системы (то есть один из самых замороченных вариантов), какие требования тут могут быть и что можно поменять?

Расстояние между двумя точками. Координаты середины отрезка.

  • если в каких то других участках программы понадобится использовать точки, то там также придется оперировать 2 переменными, а не одной, что в 2 раза сложнее.
  • вы, по большому счету, уже в самом задании оперируете термином «точка», то есть по заданию это целостный объект. Вы рассматриваете ввод точки юзером, расстояние между точками, но у вас в коде нет сущности «точка», что заставляет читателя вашего кода (а код чаще читают, чем пишут, потому читаемость кода очень важна) прилагать умственные усилия, чтобы увидеть ваши точки в коде, чтобы собрать в голове точку из ваши переменных.

public class Point2D < public double X < get; >public double Y < get; >public Point2D(double x, double y) < X = x; Y = y; >> public class Point3D < public double X < get; >public double Y < get; >public double Z < get; >public Point3D(double x, double y, double z) < X = x; Y = y; Z = z; >>

Теперь, имея на руках точки, читаем задание дальше — нам надо иметь возможность находить расстояние между точками. Вы это делаете прямо в вашей основной функции, но мы же пишем корпоративную систему — а это значит, что ваше приложение будет развиваться годами, то есть уж точно где-то когда-то, возможно уже другому программисту, понадобится точно такой же функционал — вычисление расстояния между точками.

Читайте также:
Программа мой ломбард отзывы клиентов

Поэтому, целесообразно написать функцию для этого. Но куда эту функцию деть? Я бы создал отдельный класс для работы с точками или с геометрическими примитивами, для простейших операций. Класс и сам метод я бы сделал статическими, так как вычисление расстояния между точками — это алгоритм, что навряд ли будет меняться в будущем, не зависимо от изменений в логике нашего приложения.

public static class GeomertyMath < public static double Distance(Point2D p1, Point2D p2) < return Math.Sqrt((p1.X — p2.X) * (p1.X — p2.X) + (p1.Y — p2.Y) * (p1.Y — p2.Y)); >public static double Distance(Point3D p1, Point3D p2) < return Math.Sqrt((p1.X — p2.X) * (p1.X — p2.X) + (p1.Y — p2.Y) * (p1.Y — p2.Y) + (p1.Z — p2.Z) * (p1.Z — p2.Z)); >>

Далее, вопрос — а как нам понять, что наши методы работают правильно? К тому же, программист, что будет работать над кодом после нас, может случайно или намеренно изменить наши формулы и привести программу в негодность. Как снизить риск подобного? Тут нам на помощь приходят автоматические тесты (ключевые слова для поиска в гугле — unit testing, юнит тестирование). Например, вот пара тестов с использованием фреймворка NUnit

Длина отрезка

[TestFixture] public class GeomertyMath_Tests < [Test] public void Distance2D_positive_test() < var p1 = new Point2D(10, 10); var p2 = new Point2D(13, 14); var expectedResult = 5; var actualResult = GeomertyMath.Distance(p1, p2); var eps = 0.000001; Assert.True(Math.Abs(expectedResult — actualResult) < eps); >[Test] public void Distance2D_zero_test() < var p1 = new Point2D(0, 0); var p2 = new Point2D(0, 0); var expectedResult = 0; var actualResult = GeomertyMath.Distance(p1, p2); var eps = 0.000001; Assert.True(Math.Abs(expectedResult — actualResult) < eps); >>

Итак, что мы имеем? У нас есть точки и есть проверенный и протестированный метод для расчета расстояния. Далее, нам надо уметь эти точки считать от пользователя. То есть нам нужна функция для считывания точки (2д и 3д). По мере получения опыта в разработке, вы начнете понимать такие вещи, как ответсвенность кода за какие-то функции.

Вот, например, считывание точки с консоли — это функционал, который, по идее, никак не пересекается ни с логикой работы самой точки, ни с логикой расчетов расстояний, ни вообще с геометрическими операциями. То есть считвание точки с консоли — это абсолютно обособленный функционал, поэтому я сделаю для этого отдельный класс. В принципе, я в эот класс добавлю все взаимодействие с консолью, что нам необходимо.

public interface IReaderWriter < Point2D Read2DPoint(); Point3D Read3DPoint(); string ReadLine(); void WriteLine(string line); >public class ConsoleReaderWriter : IReaderWriter < public Point2D Read2DPoint() < Console.Write(«Введите координаты x: «); var x = Convert.ToDouble(Console.ReadLine()); Console.Write(«Введите координаты y: «); var y = Convert.ToDouble(Console.ReadLine()); return new Point2D(x, y); >public Point3D Read3DPoint() < Console.Write(«Введите координаты x: «); var x = Convert.ToDouble(Console.ReadLine()); Console.Write(«Введите координаты y: «); var y = Convert.ToDouble(Console.ReadLine()); Console.Write(«Введите координаты z: «); var z = Convert.ToDouble(Console.ReadLine()); return new Point3D(x, y, z); >public void WriteLine(string line) < Console.WriteLine(line); >public string ReadLine() < return Console.ReadLine(); >>

Читайте также:
Как проверить материнку на исправность программа

Обратите внимание, что сам класс — не статический и реализует нами же написанный интерфейс. Это сделано специально, так как в будущем, если нам придется считывать точки не только с консоли, но и, например, из базы данных или веб сервиса или какого-либо другого источника данных, то будет легко написать несколько реализаций для интерфейса, где считывание с консоли будет только одним из вариантов. И тогда, мы сможем запускать наши сценарии, считывая при этом данные не только из консоли. Это нам также поможет при тестировании наших сценариев.

Итак, у нас есть считватель точек, что дальше? Дальше, у нас есть главный сценарий с выбором и 2 независимых сценария, в одном сценарии мы считываем 2д точки, в другом — 3д. Давайте это оформим в виде 3 функций. Не забываем, что эти сценарии — это отдельный функционал, который никак не связан с другими участками нашего кода, потому я его выделю в отдельный класс.

public class MainScenarios < private readonly IReaderWriter _readerWriter; public MainScenarios(IReaderWriter readerWriter) < _readerWriter = readerWriter; >public void Start() < _readerWriter.WriteLine(«1. Расстояние между двумя точками на плоскости.»); _readerWriter.WriteLine(«2. Расстояние между двумя точками в пространстве.»); _readerWriter.WriteLine(«Выберите нужный пункт (1 или 2):»); var selection = Convert.ToChar(_readerWriter.ReadLine()); switch (selection) < case ‘1’: Read2DScenario(); break; case ‘2’: Read3DScenario(); break; default: _readerWriter.WriteLine(«Вы ввели неверный символ»); break; >> private void Read2DScenario() < _readerWriter.WriteLine(«Введите первую точку:»); var p1 = _readerWriter.Read2DPoint(); _readerWriter.WriteLine(«Введите вторую точку:»); var p2 = _readerWriter.Read2DPoint(); var distance = GeomertyMath.Distance(p1, p2); _readerWriter.WriteLine($»Расстояние между двумя точками на плоскости равно «); > private void Read3DScenario() < _readerWriter.WriteLine(«Введите первую точку:»); var p1 = _readerWriter.Read3DPoint(); _readerWriter.WriteLine(«Введите вторую точку:»); var p2 = _readerWriter.Read3DPoint(); var distance = GeomertyMath.Distance(p1, p2); _readerWriter.WriteLine($»Расстояние между двумя точками в пространстве равно «); > >

Обратите внимание, что сценарии не знают, откуда точно они считывают и куда пишут значения. Этому классу со сценариями был передан просто интерфейс. Как это использовать? Давайте уже напишем логику нашей точки входа:

class Program < static void Main(string[] args) < var readerWriter = new ConsoleReaderWriter(); var logic = new MainScenarios(readerWriter); logic.Start(); Console.ReadKey(); >>

Рассчитать расстояние между двумя точками в Java

В этом кратком руководстве мы покажем, как рассчитать расстояние между двумя точками в Java.

2. Математическая формула расстояния

Допустим, у нас есть две точки на плоскости: первая точка A имеет координаты (x1, y1), а вторая точка B имеет координаты (x2, y2). Мы хотим рассчитать AB, расстояние между точками.

Во-первых, давайте построим прямоугольный треугольник с гипотенузой AB:

image

Согласно теореме Пифагора сумма квадратов длин катетов треугольника равна квадрату длины гипотенузы треугольника:AB 2 = AC 2 + CB 2 .

Во-вторых, рассчитаем AC и CB.

AC = y2 — y1
BC = x2 — x1

Подставим части уравнения:

distance * distance = (y2 — y1) * (y2 — y1) + (x2 — x1) * (x2 — x1)

Наконец, из приведенного выше уравнения мы можем рассчитать расстояние между точками:

distance = sqrt((y2 — y1) * (y2 — y1) + (x2 — x1) * (x2 — x1))

Теперь перейдем к части реализации.

3. Реализация Java

3.1. Использование простой формулы

Хотя пакеты java.lang.Math иjava.awt.geom.Point2D предоставляют готовые решения, давайте сначала реализуем приведенную выше формулу как есть:

public double calculateDistanceBetweenPoints( double x1, double y1, double x2, double y2)

Чтобы проверить решение, возьмем треугольник с катетами3 и4 (как показано на рисунке выше). Понятно, что число5 подходит в качестве значения гипотенузы:

Читайте также:
Кто директор программы голос

3 * 3 + 4 * 4 = 5 * 5

Давайте проверим решение:

3.2. Использование пакетаjava.lang.Math

Если результат умножения в методеcalculateDistanceBetweenPoints() слишком велик, может произойти переполнение. В отличие от этого, методMath.hypot() предотвращает промежуточное переполнение или потерю значимости:

public double calculateDistanceBetweenPointsWithHypot( double x1, double y1, double x2, double y2)

Возьмем те же точки, что и раньше, и проверим, что расстояние такое же:

3.3. Использование пакетаjava.awt.geom.Point2D

Наконец, давайте вычислим расстояние с помощью методаPoint2D.distance():

public double calculateDistanceBetweenPointsWithPoint2D( double x1, double y1, double x2, double y2)

Теперь протестируем метод таким же образом:

4. Заключение

В этом руководстве мы показали несколько способов рассчитать расстояние между двумя точками в Java.

Как всегда, в примерах доступен кодover on GitHub.

Источник: www.codeflow.site

Русские Блоги

Как рассчитать расстояние между двумя точками с помощью Python

Как рассчитать расстояние между двумя точками в Python?

На первом этапе давайте посмотрим на формулу для расстояния между двумя точками.

Формула расстояния между двумя точками:

?? ? ? Что это?

Метод один все еще понятен, но метод два ошеломлен?

Пожалуйста, внимательно прочтите примечания,

Другими словами, корневое число 2 также можно записать как 2 в степени 0,5 (то есть 1/2).

Это знания из средней школы, я не знаю, помните ли вы их, ха-ха .

На втором этапе нам нужно изучить функцию pow ()

pow (a, b) — функция для вычисления степени a в степени b

Например: pow (2,3) равно 2 в третьей степени, то есть 8

Третий шаг, функция split ()

Функция split () предназначена для разделения данных в соответствии с указанным форматом, по умолчанию используется пробел.

пример 1:

a = «0 1 3 5»

print(a.slpit())

Разделите данные в a пробелами и верните список в виде [‘0’, ‘1’, ‘3’, ‘5’]

Пример 2:

a = 0,1,3,5

print(s.split(«,»))

Разделите данные запятыми и верните список в виде [‘0’, ‘1’, ‘3’, ‘5’]

Формат четвертого шага ()

форматирование format () имеет тот же эффект, что и% s,% d,% f, оба сначала занимают место для данных, а затем дополняют данные

пример 1:

будний день = «понедельник»

print (‘Сегодня% s’% будний день)

Отображается как: Сегодня понедельник

Пример 2:

будний день = «понедельник»

Пятый шаг, мы смотрим на конкретный код ~

Введите 4 числа с клавиатуры, каждое число разделено пробелами, а соответствующие переменные — x0, y0, x1, y1. Вычислите расстояние между двумя точками (x0, y0) и (x1, y1). Выведите это расстояние на экран, сохраняя 2 десятичных знака. Например, ввод с клавиатуры 0 1 3 5, вывод на экран 5.00

#Входные данные ntxt = input (‘Пожалуйста, введите 4 числа (разделенных пробелами):’) # Использование функции split () для разделения данных пробелами и присвоения их переменной nls nls=ntxt.split() # Использование функции eval () для преобразования строковых типов в типы данных; #nls [0], присвоить нулевые данные в nls переменной x0 x0=eval(nls[0]) #nls [1], присвоить первые данные в nls переменной y0 y0=eval(nls[1]) #nls [2], присвоить вторые данные в nls переменной x1 x1=eval(nls[2]) #nls [3], присвоить третьи данные в nls переменной y1 y1=eval(nls[3]) # Используйте функцию pow () для вычисления расстояния между двумя точками r=pow(pow(x1-x0,2)+pow(y1-y0,2),0.5) # Печатать данные; где 2f означает сохранение двух десятичных знаков print(».format(r))

Примечание: print (». Format (r)) означает: используйте , чтобы занять позицию; .2f означает сохранить два десятичных разряда.

Источник: russianblogs.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru