Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 25.03.2019
Сообщений: 11
1

Определить могут ли 4 точки быть вершинами параллелограмма

26.03.2019, 13:42. Показов 4019. Ответов 7

Author24 — интернет-сервис помощи студентам
Дано четыре точки А1(x1,y1),A2(x2,y2),A3(x3,y3),A4(x4,y4).Определить могут ли они быть вершинами параллелограмма
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2019, 13:42
Ответы с готовыми решениями:

Определить, могут ли три точки быть вершинами треугольника
Всем привет!Помогите решить задачи завтра нужно сдать.Составить алгоритм по блокам,в письменном...

Определить, являются ли точки заданного множества вершинами параллелограмма
Здравствуйте! Такое вот задание: Определить, являются ли точки заданного множества вершинами...

Даны четыре точки А1(x1, y1), А2(x2, y2), А3(x3, y3), А4(x4, y4). Определить будут ли они вершинами параллелограмма.
Даны четыре точки А1(x1, y1), А2(x2, y2), А3(x3, y3), А4(x4, y4). Определить будут ли они вершинами...

Если точки могут быть вершинами равностороннего треугольника, вычислить его площадь и длину высоты
#include <iostream> #include <conio.h> #include <math.h> int main() { setlocale...

7
0 / 0 / 0
Регистрация: 25.03.2019
Сообщений: 11
26.03.2019, 16:37  [ТС] 3
надо на C++
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
26.03.2019, 17:20 4
Verevkin, ты дал ссылку на неверный ответ. Ну как там параллелограм тестится? if (y2=y4) ? Смешно! Это работает только с выовненным по осям параллелограммом.

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
l0 = (y1-y0)*(y1-y0) + (x1-x0)*(x1-x0);
l1 = (y2-y1)*(y2-y1) + (x2-x1)*(x2-x1);
l2 = (y3-y2)*(y3-y2) + (x3-x2)*(x3-x2);
l3 = (y0-y3)*(y0-y3) + (x0-x3)*(x0-x3);
if (l0==l2 && l1==l3)
{
...
}
0
Заблокирован
26.03.2019, 17:39 5
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ты дал ссылку на неверный ответ.
А я его не читал. Так получилось.
0
Заблокирован
26.03.2019, 19:35 6
Короче, чуваки,... я в сишнике не копенгаген, но, основываясь на здравом смыле, функцию запилил. Ничего не гарантирую, пожалуйста, тестируйте. Каким бы ни был результат, отпишитесь ниже.

Определить могут ли 4 точки быть вершинами параллелограмма

Определить могут ли 4 точки быть вершинами параллелограмма

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#define precision 1e-11 // точность проверки равенства
#define EQUAL(f1, f2) (fabs(f1 - f2) < precision) // равенство с плавающей точкой
 
typedef struct { double x, y; } TFPoint; // плоские нецелые координаты
 
// параллельность двух прямых, каждая из которых задана двумя точками 
bool isParallel(TFPoint a1, TFPoint a2, TFPoint b1, TFPoint b2)
{
  double k1 = (a1.y - a2.y) / (a1.x - a2.x);
  double k2 = (b1.y - b2.y) / (b1.x - b2.x);
  return EQUAL(k1, k2);
}
 
// проверка, являются ли точки A, B, C, D вершинами параллелограма
bool isParallelogram(TFPoint A, TFPoint B, TFPoint C, TFPoint D)
{
  return (isParallel(A, B, C, D) && isParallel(B, C, A, D)) ||  
         (isParallel(A, B, C, D) && isParallel(A, C, B, D)) ||
         (isParallel(B, C, A, D) && isParallel(A, C, B, D));
}
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
26.03.2019, 22:19 7
Цитата Сообщение от Verevkin Посмотреть сообщение
double k1 = (a1.y - a2.y) / (a1.x - a2.x);
divide by zero
0
Заблокирован
26.03.2019, 23:22 8
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
divide by zero
Да, вырожденный случай (прямая параллельна оси Y) я не учёл, бывает. Допилишь?

Добавлено через 18 минут
Исправил только эту функцию, остальное не трогал.
C++
1
2
3
4
5
6
7
8
9
10
11
// параллельность двух прямых, каждая из которых задана двумя точками 
bool isParallel(TFPoint a1, TFPoint a2, TFPoint b1, TFPoint b2)
{
  // вырожденный случай одна из прямых, параллельной оси Y
  double dax = a1.x - a2.x, dbx = b1.x - b2.x;
  if (EQUAL(dax, 0.0) || EQUAL(dbx, 0.0)) return EQUAL(dax, dbx);
 
  // для остальных случаев
  double k1 = (a1.y - a2.y) / dax, k2 = (b1.y - b2.y) / dbx;
  return EQUAL(k1, k2);
}
Добавлено через 38 минут
Воторой вырожденный случай - все 4 точки лежат на одной прямой. Если это не контролировать, то функция возвратит true.
Я попытался предотвратить и это безобразие. Вот программа целиком. Тестируйте, я устал.

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/* Verevkin, CodeBlocks, кодировка файла: UTF-8 BOM */
 
#include <stdlib.h>
#include <stdio.h>    
#include <conio.h>
#include <string.h>
#include <math.h>
 
/* Формула прямой по двум точкам:
  (y1 - y2)x + (x2 - x1)y + (x1y2 - x2y1) = 0
  
  угловой коэффициент прямой:
  k = (y1 - y2) / (x1 - x2)
  
  прямые параллельны, если угловые коэффициенты равны */
 
#define precision 1e-11 // точность проверки равенства
#define EQUAL(f1, f2) (fabs(f1 - f2) < precision) // равенство с плавающей точкой
 
typedef struct { double x, y; } TFPoint; // плоские нецелые координаты
 
// принадлежность трёх точек одной прямой
bool isSameLine(TFPoint p1, TFPoint p2, TFPoint p3)
{
  return EQUAL(p3.x * (p1.y - p2.y) + 
               p3.y * (p2.x - p1.x) + 
               (p1.x * p2.y - p2.x * p1.y), 0.0);
}
 
// параллельность двух прямых, каждая из которых задана двумя точками 
bool isParallel(TFPoint a1, TFPoint a2, TFPoint b1, TFPoint b2)
{
  // вырожденный случай: одна из прямых (или обе), параллельна оси Y
  double dax = a1.x - a2.x, dbx = b1.x - b2.x;
  if (EQUAL(dax, 0.0) || EQUAL(dbx, 0.0)) return EQUAL(dax, dbx);
 
  // для остальных случаев
  double k1 = (a1.y - a2.y) / dax, k2 = (b1.y - b2.y) / dbx;
  return EQUAL(k1, k2);
}
 
// проверка, являются ли точки A, B, C, D вершинами параллелограма
bool isParallelogram(TFPoint A, TFPoint B, TFPoint C, TFPoint D)
{
  // проверка, что все 4 точки не лежат на одной прямой
  if (isSameLine(A, B, C) && isSameLine(B, C, D)) return false;
  
  // проверка, что стороны взаимно параллельны (всего 6 прямых)
  return (isParallel(A, B, C, D) && isParallel(B, C, A, D)) ||  
         (isParallel(A, B, C, D) && isParallel(A, C, B, D)) ||
         (isParallel(B, C, A, D) && isParallel(A, C, B, D));
}
 
int main(int argc, char** argv) 
{
    system("chcp 65001 & cls");
    
    TFPoint a = {1.0, 1.0}, b = {2.0, 4.0}, c = {6.0, 2.0}, d = {7.0, 5.0};
    //TFPoint a = {1.0, 1.0}, b = {2.0, 2.0}, c = {3.0, 3.0}, d = {4.0, 4.0}; // на одной прямой
    // кто-нибудь, придумайте 2-й вырожденный случай (стороны параллельны OY)
    
    printf(" (%g; %g), (%g; %g), (%g; %g), (%g; %g)\n", a.x, a.y, b.x, b.y, c.x, c.y, d.x, d.y);
  printf(" Это%s параллелограм\n", isParallelogram(a, b, c, d) ? "" : " НЕ");
    
    printf("\n >> Нажми что-нибудь для выхода... ");
    getch();
    return 0;
}
0
26.03.2019, 23:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.03.2019, 23:22
Помогаю со студенческими работами здесь

Если три точки могут быть вершинами разностороннего тупоугольного треугольника, вычислите его площадь
написал код на задачу, вроде работает, но выдает какую-то хрень, проверьте плиз, исправьте если...

Диагонали (Четыре точки являются вершинами параллелограмма. Определить длину диагоналей и найти координаты )
Помогите!!! Четыре точки A(x1; y1), B(x2; y2), C(x3; y3), D(x4; y4) являются вершинами...

Определить, могут ли три точки с координатами являться вершинами треугольника
Здравствуйте. Помогите написать алгоритм и блок схему к работе. Определить, могут ли три точки с...

Являются ли точки заданного множества вершинами параллелограмма со сторонами, параллельными оси ОХ
Определить, являются ли точки заданного множества вершинами параллелограмма со сторонами,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru