Ученик
(94),
закрыт
8 лет назад
Globe
Просветленный
(24815)
8 лет назад
Получаете координаты трех вершин: (x1, y1) (x2, y2) (x3, y3)
Выясняете, какой угол – прямой:
(x2-x1)*(x3-x1)+(y2-y1)*(y3-y1) = 0, значит, прямой угол – при вершине (x1, y1)
тогда координаты четвертой вершины равны:
x = x1 + (x2-x1) + (x3-x1)
y = y1 + (y2-y1) + (y3-y1)
(x1-x2)*(x3-x2)+(y1-y2)*(y3-y2) = 0, значит, прямой угол – при вершине (x2, y2)
тогда координаты четвертой вершины равны:
x = x2 + (x1-x2) + (x3-x2)
y = y2 + (y1-y2) + (y3-y2)
(x1-x3)*(x2-x3)+(y1-y3)*(y2-y3) = 0, значит, прямой угол – при вершине (x3, y3)
тогда координаты четвертой вершины равны:
x = x3 + (x1-x3) + (x2-x3)
y = y3 + (y1-y3) + (y2-y3)
????
PROFIT!
Великий ЗомбиниУченик (94)
8 лет назад
“Выясняете, какой угол – прямой: “
Вот честно даже читать дальше не стала.. . я же написала ПРЯМОУГОЛьник
Великий ЗомбиниУченик (94)
8 лет назад
вот знаешь.. . это все хоть и работает, а я всеравно не знаю откуда ты все это взял. но я разберусь. спасибо)
Максим (Некромант)
Просветленный
(28848)
8 лет назад
это же элементарно
просишь в вести координаты вершины (их всего три)
это значит по два числа на вершину (Х и У) – создаешь при этом масив двух мерный
и загоняешь туда последовательно 3 отданых числа х и у
далее создаем некую логику
нас интересует всего лишь введенные первые координаты и третие
проверяем что бы х1 не равнялся x3 (тоесть проверяем что бы х первого числа не ровнялся х терьего числа ) – если не ровняется тогда х ровняется первому введеному чеслу х – а у третьему введенному числу Y – далее если все же Х третьего числа равняется Х первого числа тогда Х ровняется второго введенного числа Х а У третьего !
вот и вся логика
Великий ЗомбиниУченик (94)
8 лет назад
Что-то не сходится.
Если нам вводят координаты
1; 1
1; 3
3; 3
то, следуя вашей логике, мы получаем координаты 1; 3. Правильно я считаю? Но неизвестная вершина находится в координатах 3; 1
Сергей Марков
Мудрец
(10064)
8 лет назад
Добрый день.
Немного теории.
Исходя из свойств прямоугольника в общем виде координаты вершин (обозначим их А, B, C, D) можно представить в таком виде:
A(x, y); B(x+a,y)
C(x. y+b); D(x+a, y+b)
Можно видеть, что множество значений x имеет значения {x, x+a, x, x+a}, и множество значений y имеет значения {y, y, y+b, y+b}
Теперь представим, что мы получаем в произвольном порядке значения координат трех вершин, и если они принадлежат прямоугольнику, то они будут принадлежать указанным выше множествам и подчиняться их свойствам. Другими словами, из трех значений x – два значения обязательно будут равны, то же самое со значениями y.
Теперь дело техники.
Немного практики.
На Паскале это можно реализовать, например так:
Исходные значения координат я задал в программе, Вы же можете использовать команду ввода с клавиатуры, но тогда необходимо задать проверку координат на принадлежность их прямоугольнику.
Успехов.
Великий ЗомбиниУченик (94)
8 лет назад
“из трех значений x – два значения обязательно будут равны, то же самое со значениями y.”
Вот здесь вы наверно ошибаетесь. Если прямоугольник будет наклонен? Что-то типа этого)
Timon55 0 / -1 / 0 Регистрация: 25.07.2017 Сообщений: 10 |
||||
1 |
||||
По трём вершинам прямоугольника определить четвёртую28.08.2017, 05:14. Показов 3518. Ответов 3 Метки нет (Все метки)
Есть программа,которая по заданным координатам трёх вершин определяет координаты четвертой. Я не могу понять как она работает, ну то есть сам алгоритм нахождения координат четвертой вершины. Подскажите кому не трудно. Заранее благодарен. Листинг:
-0.50 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
28.08.2017, 05:14 |
Ответы с готовыми решениями: Нахождение площади прямоугольника по его вершинам По трем вершинам прямоугольника найти координаты четвертой 4. По известным… По известным трем вершинам прямоугольника (x1, y1), (x2, y2), (x3, y3) найти координаты четвертой вершины Прокомментируйте код, находящий 4-ю вершину прямоугольника по трём заданным 3 |
3638 / 2970 / 918 Регистрация: 05.07.2013 Сообщений: 14,220 |
|
28.08.2017, 08:23 |
2 |
на бумажке нарисуй три точки, построй из каждой точки вектора к двум другим, для одной из точек угол между векторами будет равен 90, значит это стороны прямоугольника, осталось найти их сумму.
0 |
164 / 170 / 139 Регистрация: 28.11.2016 Сообщений: 301 |
|
28.08.2017, 09:03 |
3 |
Сообщение было отмечено Timon55 как решение Решение Условие (x3-x2)*(x2-x1)+(y3-y2)*(y2-y1) = 0 это условие перпендикулярности векторов. Миниатюры
1 |
0 / -1 / 0 Регистрация: 25.07.2017 Сообщений: 10 |
|
28.08.2017, 09:15 [ТС] |
4 |
Xoraxax, спасибо за помощь Добавлено через 2 минуты
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
28.08.2017, 09:15 |
Помогаю со студенческими работами здесь Определить, где находится текущая точка: внутри прямоугольника, снаружи, на границе прямоугольника По заданным вершинам определить фигуру Определить, какой из треугольников, построенных по заданным вершинам, имеет наибольшую площадь Определить, сколько чисел кратно трём Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 4 |
Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article
Given an N * M grid. It contains exactly three ‘*’ and every other cell is a ‘.’ where ‘*’ denotes a vertex of a rectangle. The task is to find the coordinates of the fourth (missing) vertex (1-based indexing).
Examples:
Input: grid[][] = {“*.*”, “*..”, “…”}
Output: 2 3
(1, 1), (1, 3) and (2, 1) are the given coordinates of the rectangle where (2, 3) is the missing coordinate.
Input: grid[][] = {“*.*”, “..*”}
Output: 2 1
Approach: Find the coordinates of the 3 vertices by iterating through the given grid. Since a rectangle consists of 2 X-coordinates and 2 Y-coordinates and 4 vertices, every X-coordinate and Y-coordinate should occur exactly twice. We can count how many times each X and Y coordinate occurs in the 3 given vertices and the 4th one will have coordinates that occur only once.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using
namespace
std;
pair<
int
,
int
> findFourthVertex(
int
n,
int
m, string s[])
{
unordered_map<
int
,
int
> row, col;
for
(
int
i = 0; i < n; i++)
for
(
int
j = 0; j < m; j++)
if
(s[i][j] ==
'*'
) {
row[i]++;
col[j]++;
}
int
x, y;
for
(
auto
tm
: row)
if
(
tm
.second == 1)
x =
tm
.first;
for
(
auto
tm
: col)
if
(
tm
.second == 1)
y =
tm
.first;
return
make_pair(x + 1, y + 1);
}
int
main()
{
string s[] = {
"*.*"
,
"*.."
,
"..."
};
int
n =
sizeof
(s) /
sizeof
(s[0]);
int
m = s[0].length();
auto
rs = findFourthVertex(n, m, s);
cout << rs.first <<
" "
<< rs.second;
}
Java
import
java.util.HashMap;
import
java.util.Map;
class
GfG
{
static
Pair<Integer, Integer> findFourthVertex(
int
n,
int
m, String s[])
{
HashMap<Integer, Integer> row =
new
HashMap<>();
HashMap<Integer, Integer> col =
new
HashMap<>();
for
(
int
i =
0
; i < n; i++)
{
for
(
int
j =
0
; j < m; j++)
{
if
(s[i].charAt(j) ==
'*'
)
{
if
(row.containsKey(i))
{
row.put(i, row.get(i) +
1
);
}
else
{
row.put(i,
1
);
}
if
(col.containsKey(j))
{
col.put(j, col.get(j) +
1
);
}
else
{
col.put(j,
1
);
}
}
}
}
int
x =
0
, y =
0
;
for
(Map.Entry<Integer, Integer> entry : row.entrySet())
{
if
(entry.getValue() ==
1
)
x = entry.getKey();
}
for
(Map.Entry<Integer, Integer> entry : col.entrySet())
{
if
(entry.getValue() ==
1
)
y = entry.getKey();
}
Pair<Integer, Integer> ans =
new
Pair<>(x +
1
, y +
1
);
return
ans;
}
public
static
void
main(String []args)
{
String s[] = {
"*.*"
,
"*.."
,
"..."
};
int
n = s.length;
int
m = s[
0
].length();
Pair<Integer, Integer> rs = findFourthVertex(n, m, s);
System.out.println(rs.first +
" "
+ rs.second);
}
}
class
Pair<A, B>
{
A first;
B second;
public
Pair(A first, B second)
{
this
.first = first;
this
.second = second;
}
}
Python3
def
findFourthVertex(n, m, s) :
row
=
dict
.fromkeys(
range
(n),
0
)
col
=
dict
.fromkeys(
range
(m),
0
)
for
i
in
range
(n) :
for
j
in
range
(m) :
if
(s[i][j]
=
=
'*'
) :
row[i]
+
=
1
;
col[j]
+
=
1
;
for
keys,values
in
row.items() :
if
(values
=
=
1
) :
x
=
keys;
for
keys,values
in
col.items() :
if
(values
=
=
1
) :
y
=
keys;
return
(x
+
1
, y
+
1
) ;
if
__name__
=
=
"__main__"
:
s
=
[
"*.*"
,
"*.."
,
"..."
]
n
=
len
(s);
m
=
len
(s[
0
]);
rs
=
findFourthVertex(n, m, s);
print
(rs[
0
], rs[
1
])
C#
using
System;
using
System.Collections.Generic;
class
GfG
{
static
Pair<
int
,
int
> findFourthVertex(
int
n,
int
m, String []s)
{
Dictionary<
int
,
int
> row =
new
Dictionary<
int
,
int
>();
Dictionary<
int
,
int
> col =
new
Dictionary<
int
,
int
>();
for
(
int
i = 0; i < n; i++)
{
for
(
int
j = 0; j < m; j++)
{
if
(s[i][j] ==
'*'
)
{
if
(row.ContainsKey(i))
{
row[i] = row[i] + 1;
}
else
{
row.Add(i, 1);
}
if
(col.ContainsKey(j))
{
col[j] = col[j] + 1;
}
else
{
col.Add(j, 1);
}
}
}
}
int
x = 0, y = 0;
foreach
(KeyValuePair<
int
,
int
> entry
in
row)
{
if
(entry.Value == 1)
x = entry.Key;
}
foreach
(KeyValuePair<
int
,
int
> entry
in
col)
{
if
(entry.Value == 1)
y = entry.Key;
}
Pair<
int
,
int
> ans =
new
Pair<
int
,
int
>(x + 1, y + 1);
return
ans;
}
public
static
void
Main(String []args)
{
String []s = {
"*.*"
,
"*.."
,
"..."
};
int
n = s.Length;
int
m = s[0].Length;
Pair<
int
,
int
> rs = findFourthVertex(n, m, s);
Console.WriteLine(rs.first +
" "
+ rs.second);
}
}
class
Pair<A, B>
{
public
A first;
public
B second;
public
Pair(A first, B second)
{
this
.first = first;
this
.second = second;
}
}
Javascript
<script>
function
findFourthVertex(n, m, s)
{
var
row =
new
Map(), col =
new
Map();
for
(
var
i = 0; i < n; i++)
for
(
var
j = 0; j < m; j++)
if
(s[i][j] ==
'*'
) {
if
(row.has(i))
row.set(i, row.get(i)+1)
else
row.set(i, 1)
if
(col.has(j))
col.set(j, col.get(j)+1)
else
col.set(j, 1)
}
var
x, y;
row.forEach((value, key) => {
if
(value == 1)
x = key;
});
col.forEach((value, key) => {
if
(value == 1)
y = key;
});
return
[x + 1, y + 1];
}
var
s = [
"*.*"
,
"*.."
,
"..."
];
var
n = s.length;
var
m = s[0].length;
var
rs = findFourthVertex(n, m, s);
document.write( rs[0] +
" "
+ rs[1]);
</script>
Time Complexity: O(N*M), as we are using a loop to traverse N*M times.
Auxiliary Space: O(N + M), as we are using extra space for map.
Last Updated :
31 May, 2022
Like Article
Save Article
Vote for difficulty
Current difficulty :
Basic
Даны координаты трех вершин прямоугольника:А(4;-2),В(4;4),С(-4;4)
а ) Постройте четвертую вершину D этого прямоугольника и найдите ее координаты.
б ) Вычислите периметр и площадь прямоугольника , если единичный отрезок равен 1 см.
uses crt,graphABC; var x1,y1,x2,y2,x3,y3,x4,y4,k:integer; x11,y11,x12,y12,x13,y13:integer;//для построения прямоугольника s1,s2:string; begin clrscr; repeat writeln('Введите координаты 3х вершин прямоугольника от 100 до 450:'); readln(x1,y1,x2,y2,x3,y3); //чтобы 4-я вершина вошла на экран until(x1>=100)and(x1<=400)and(y1>=100)and(y1<=400) and (x2>=100)and(x2<=400)and(y2>=100)and(y2<=400) and(x3>=100)and(x3<=400)and(y3>=100)and(y3<=400); k:=0; //если первая точка вершина прямого угла if (x2-x1)*(x3-x1)+(y2-y1)*(y3-y1)=0 then begin x4:=x3+x2-x1; y4:=y3+y2-y1;//координаты 4 точки x11:=x1; y11:=y1;//координаты 3-х вершин прямоугольника x12:=x2; y12:=y2; x13:=x3;y13:=y3; end //если вторая else if (x1-x2)*(x3-x2)+(y1-y2)*(y3-y2)=0 then begin x4:=x3+x1-x2; y4:=y3+y1-y2; x11:=x2; y11:=y2; x12:=x1; y12:=y1; x13:=x3;y13:=y3; end //если третья else if (x1-x3)*(x2-x3)+(y1-y3)*(y2-y3)=0 then begin x4:=x2+x1-x3; y4:=y2+y1-y3; x11:=x3; y11:=y3; x12:=x2; y12:=y2; x13:=x1;y13:=y1; end //если нет прямого угла else k:=1; hidecursor; setwindowsize(500,500); clearwindow; //рисуем 3 вершины setbrushcolor(clBlue); circle(x1,y1,3); circle(x2,y2,3); circle(x3,y3,3); //выводим координаты setbrushstyle(bsClear); setfontcolor(clBlue); str(x1,s1); str(y1,s2); textout(x1+10,y1,'1-('+s1+','+s2+')'); str(x2,s1); str(y2,s2); textout(x2+10,y2,'2-('+s1+','+s2+')'); str(x3,s1); str(y3,s2); textout(x3+10,y3,'3-('+s1+','+s2+')'); if k=1 then //если не прямоугольник begin setbrushstyle(bsClear); //выводим сообщение setfontcolor(clBlack); textout(0,0,'Данные точки не вершины прямоугольника'); end else //прямоугольник begin setbrushcolor(clRed); //4 точка circle(x4,y4,3); str(x4,s1); str(y4,s2); setbrushstyle(bsClear); setfontcolor(clRed); textout(x4+10,y4,'4-('+s1+','+s2+')');//координаты setpencolor(clBlue); moveto(x11,y11); lineto(x12,y12); lineto(x4,y4); lineto(x13,y13); lineto(x11,y11); setfontcolor(clBlack);//сообщение textout(100,10,'Координаты четвертой вершины '+s1+' '+s2) end; end.