Ученик
(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.”
Вот здесь вы наверно ошибаетесь. Если прямоугольник будет наклонен? Что-то типа этого)
Так, как я понял задачу. Есть обычная декартова система координат, прямоугольник, стороны a и b, одна его точка, и он повернут относительно этой точки на угол.
Вопрос в том, как он располагался ранее, что за длины a и b.
A3
-------a------<- A2
| |
b |
| |
--------------
^ ^
A0 A1
Если представить картину таким образом, то все предельно просто. A0
, естественно, остается на месте.
Если это то, что нужно вам. Но в общем случае прямоугольник-то уже мог быть изначально ориентирован как угодно. Вам нужно четко ставить задачу – даже для самого себя, а иначе получается “мне надо что-то посчитать!” – “ну возьмите какие-нибудь формулы…”
Контрольные задания > Даны координаты трёх вершин прямоугольника ABCD: А (-4; -2), С (2; 4) и D (2; -2). Начертите этот прямоугольник. Найдите координаты вершины В. Найдите координаты точки пересечения диагоналей прямоугольника. Вычислите площадь и периметр прямоугольника, считая, что длина единичного отрезка координатных осей равна 1 см.
Ответ:
[2) B( – 4;4).]
[3) E( – 1;1).]
[4) S = 6 cdot 6 = 36 см^{2}.]
[P = 2 cdot (6 + 6) = 2 cdot 12 = 24 см. ]
Похожие
- Даны координаты трёх вершин прямоугольника ABCD: A (−1; −3), C (5; 1) и D (5; −3).
- Даны координаты трёх вершин прямоугольника ABCD: A (−2; −2), B (−2; 4) и D (6; −2).
- Даны координаты трёх вершин прямоугольника ABCD: A (−2; −3), B (−2; 5) и C (4; 5).
- Даны координаты трёх вершин прямоугольника ABCD: B(−3;6); C(5;6) и D(5;−2).
- Даны координаты трёх вершин прямоугольника ABCD: А (-1; -1), В (-1; 3) и D (5; -1). Начертите прямоугольник ABCD. Найдите координаты вершины С. Найдите координаты точки пересечения диагоналей прямоугольника. Вычислите площадь и периметр прямоугольника, считая, что длина единичного отрезка координатных осей равна 1 см.
- Даны числа 289, 441, 577. Выберите те из них, которые можно представить в виде квадрата некоторого числа, и запишите соответствующее равенство (используйте таблицу квадратов двузначных чисел).
- Даны числа 3/7, 2/3 и 0,3. Какое из них самое маленькое?
- Даны числа 3/7, 3/5 и 0,7. Какое из них самое большое?
- Даны числа 361, 442, 576. Выберите те из них, которые можно представить в виде квадрата некоторого числа, и запишите соответствующее равенство (используйте таблицу квадратов двузначных чисел).
- Даны числа 4/9, 3/4 и 0,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
Есть прямоугольник, чьи вершины заданы левой верхней точкой (x1, y1) и правой нижней (x2, y2). Необходимо произвести вращение прямоугольника вокруг произвольной точки (x0, y0) на угол α и найти координаты всех вершин после поворота.
Теория
Используем аффинные матрицу поворота и матрицу переноса. Формулы для нахождения координат при повороте следующие:
Точка вокруг которой хотим повернуть изображение имеет координаты O (x0, y0) . Чтобы получить значение x и y для формул выше, необходимо их нормализовать.
Смещение D(x,y) определяет, куда хотим поместить точку вращения после поворота. В подавляющем большинстве случаев оно равно точке вращения.
Окончательный вид формул:
Интерактив
На интерактиве ниже работают только эти формулы. «Произвольная» точка вращения зазывно мигает. Дескать, можно таскать. За вершины «не-повернутого» серого прямоугольника также можно таскать, меняя тем самым исходные координаты. При изменении координат происходит масштабирование с таким расчетом, чтобы «влез» процесс поворота. Делать на всю ширь возможных орбит смысла не увидел, т.к. они могут быть астрономически большими.
Переключатель «Математическая координатная сетка» показывает родную для математиков систему координат с центром координат посередине и осью Y, направленной вверх. Если режим выключен, демонстрируется координатная сетка, привычная для программистов — начало координат в левом верхнем углу и ось Y направлена вниз.
Переключатель «Анимация» включает плавное изменение угла с целью медитативного эффекта познания сущего.
Вращать вокруг центра прямоугольника
Все координаты находятся в отрицательном секторе!
При отключенном режиме математической сетки данные могут быть не видны!
Чтобы их увидеть включите режим математической сетки и сдвиньте точку вращения в положительный сектор, который находится в правом верхнем квадранте.
Get a better browser, bro…
Математическая координатная сетка
Немного кода
Delphi
// Посчитать координаты точки повернутой на Angle радиан function CalcAnglePoint(const ACenter, APoint: TPointF; const Angle: Single): TPointF; var sn,cs: single; begin SinCos(Angle, sn, cs); Result.X := (APoint.X–ACenter.X) * cs – (APoint.Y–ACenter.Y) * sn + ACenter.X; Result.Y := (APoint.X–ACenter.X) * sn + (APoint.Y–ACenter.Y) * cs + ACenter.Y; end; |
JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// расчет координат вершин по углу и центру вращения // angle – угол в радианах // center – точка, вокруг которой происходит вращение // points – массив с координатами вершин прямоугольника // vpoints – массив с повернутыми координатами вершин // массивы points и vpoints должны быть одной размерности ssin = Math.sin(angle); scos = Math.cos(angle); for (let i = 0; i < points.length; i++) { vpoints[i].x = center.x + (points[i].x – center.x) * scos – (points[i].y – center.y) * ssin; vpoints[i].y = center.y + (points[i].x – center.x) * ssin + (points[i].y – center.y) * scos; } |
Вращение прямоугольника вокруг произвольной точки и нахождение координат вершин производится таким незамысловатым кодом. Стоит отметить, что функции применимы к любому количеству вершин. Таким образом можно посчитать координаты любого многоугольника.
Друзья, спасибо за внимание!
Подписывайтесь на телегу.
Пишите комментарии.
Спрашивайте.
Поискать похожие темы на сайте.