Мозг
Просветленный
(45393)
11 лет назад
Достаточно просто, если прямоугольник расположен на экране, а не под каким-нибудь углом в 47 градусов. Для этого, находим координаты по x и y у всех точек. Каждое значение должно повторяться дважды. Какие значения повторятся лишь один раз, те и есть у неизвестной точки.
Поясню на примере. Выше вам нарисовали прямоугольник ABDC
Допустим, неизвестна точка B (координаты) .
Возьмём для простоты такие значения для точек:
A (1, 3)
C (1, 7)
D (4, 7)
7 это координата игрек и она повторяется дважды: у точек C и D, которые находятся на одной вертикальной прямой.
точка 1 по икс есть у точек A и C, они расположены на одной прямой по оси икс.
Точка 3 по игрек есть только у A. Соответственно, раз она лишь однажды повторяется по оси игрек, то второй раз она повторится у точки B. Тогда координата по игрек у B равна 3.
Точка 4 по иксу есть лишь у точки D. Значит, второй раз она будет у B.
Соответственно, точка B имеет координаты B (4, 3)
Это справедливо лишь для прямоугольников, не имеющих сдвига относительно экрана.
Для сдвинутых на определённый угол, скажем на 53 градуса, нужно вычислить вначале, какая именно точка неизвестна (через сравнение координат) , а потом по относительному смещению (разница между координатами на параллельных сторонах) найти нужные координаты.
Приведу простой пример:
Имеет прямоугольник ABCD
Сверяем известные координаты по иксу, имеем значения -5, 1 и 7 и по игреку 8, 3 и 11 соответственно. Находим длины отрезков AB, BD, DA через сумму квадратов разницы их координат
AD ^ 2 (в квадрате) = (1 – (-5)) ^ 2 + (3 – 8) ^ 2 = (6 ^ 2 + (-5) ^ 2) = 36 + 25 = 61
Значит AB = корень квадратный из 61 или просто 61 ^ 0.5
Также находим длину AB ^ 2= (1 – 7) ^ 2 + (3 – 11) ^ 2 = 36 + 64 = 100
AB = 100 ^ 0.5 = 10
DB ^ 2 = (-5 -7) ^ 2 + (8 – 11) ^ 2 = (-12) ^ 2 + (-3) ^ 2 = 144 + 9 = 153
DB = 153 ^ 0.5
Так как мы знаем координаты трёх точек, то они в любом случае (в прямоугольнике) составляют прямоугольный треугольник. Нам важно выяснить, какая из сторон самая длинная (она будет гипотенузой, а значит, точка, не участвующая в границах отрезка гипотенузы, будет противоположна той, что неизвестна. В нашем случае мы получили отрезки длиной
153 ^ 0.5, 61 ^ 0.5 и 100 ^ 0.5.
При проверке на равенство оно не выполняется (ошибка) 100 + 61 != 153. Но это потому что я от балды нарисовал прямоугольник. В действительности, просто у прямоугольника, с точками A (1, 3) и D(-5, 8) точка B не может иметь координат (7, 11) . Хотя бы одна из координат будет немного отличаться.
Ну да ладно – это ведь просто наглядный пример, и мне некогда тут высчитывать точное равенство.
Тогда мы узнали, что самая длинная сторона, получающаяся из известных точек, это сторона DB. А значит, раз точка А не является концом этой стороны, то мы можем утверждать, что абсцисса (координата X) неизвестной точки C находится по неравенству Ax – Dx = Bx – Cx
Тогда Cx = Bx – Ax + Dx
Подставим известные абсциссы, получим
Cx = 7 – 1 + (-5) = 1
А ордината C (координата по Y) находится из неравенства:
Ay – Dy = By – Cy
Cy = By – Ay + Dy
Cy = 11 – 3 + 8 = 16
Итого, получили координаты точки C (1, 16), что является верным ответом.
Можно вычислить координаты C немного по-другому:
Ax – Bx = Dx – Cx
Cx = Dx – Ax + Bx
Cx = -5 – 1 + 7 = 1
Ay – By = Dy – Cy
Cy = Dy – Ay + By
Cy = 8 – 3 + 11 = 16
То есть, для получения неизвестной точки мы складываем координаты точек гипотенузы треугольника, составленного из известных точек, и вычитаем точку, объединяющую катеты.
Ничего сложного, элементарная геометрия за 7 класс. Прочитайте ещё раз внимательно.
Источник: Тут всё очень просто.
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 классами, один для вершин и другой для целого прямоугольника.
Проблема в том, что мой код работает для определенной настройки вершины. Я много чего пробовал, но все равно не получилось.
Вот код:
#include <iostream>
#include <cmath>
using namespace std;
class vertex{
public:
double x;
double y;
void insert(){
cin>>x;
cin>>y;
}
};
class rect{
private:
double ax, ay, bx, by, cx, cy, dx, dy;
public:
void insert_data(vertex A, vertex B, vertex C){ //inserting rectangle data
ax=A.x;
ay=A.y;
bx=B.x;
by=B.y;
cx=C.x;
cy=C.y;
}
void calculate(){ //finding 4h vertex coordinates
dx=cx+(abs(ax-bx));
dy=cy+(abs(ay+by));
}
void out(){ //output
cout<<dx<<" "<<dy;
}
};
using namespace std;
int main() {
vertex A, B, C;
A.insert();
B.insert();
C.insert();
rect X;
X.insert_data(A, B, C);
X.calculate();
X.out();return 0;
}
Поскольку я думаю об этом сейчас, он может иметь какое-то отношение к вставке координат в правильные переменные, но не может придумать решение, чтобы это исправить.
Например:
Входные данные:
1 1
0 3
3 2
Выход:
2 4
Порядок ввода каждой вершины не указан.
3
Решение
Если у вас есть три вершины, то у вас есть половина прямоугольника: прямоугольный треугольник. Сначала нужно определить, какая точка находится под прямым углом. Вы можете сделать это по-разному. Один из способов — применить теорему Пифагора: найти две самые дальние вершины. Оставшаяся вершина находится под прямым углом (другим способом может быть вычисление скалярного произведения между каждой парой ребер, а та, которая ближе всего к нулю, образует прямой угол).
Давайте назовем вершину под прямым углом A
и два других B
а также C
, Теперь векторы двух более коротких ребер прямоугольного треугольника B-A
а также C-A
, Если вы добавите эти края в A
вы получите 4-ю вершину:
D=A+(B-A)-(C-A)=B+C-A
2
Другие решения
Работа с векторами — очень интересная тема. Вот несколько хороших объяснений о вектор
Чтобы ответить на ваш вопрос:
Из трех заданных вершин A, B и C у вас есть только три случая прямого угла: в A, в B или в C. Если вы нашли правильный угол, например, в B (независимо от порядка A и C) , у вас есть координата D, рассчитанная по формуле: D = A + C — B.
Чтобы определить, что прямой угол равен B: произведение точек двух векторов BA и BC равно 0, независимо от порядка A и C.
В C ++ (не C) вы должны добавить операторы для управления векторами в вашем классе вершин, вот пример:
#define MY_EPSILON 10E-6
class vertex {
public:
double X, Y;
vertex(double x_, double y_ ) :X(x_), Y( y_){}
vertex():X(0), Y(0){}
vertex operator +( vertex v ){ return vertex( X + v.X, Y + v.Y ); }
vertex operator -( vertex v ){ return vertex( X - v.X, Y - v.Y ); }
double dot( vertex v ){ return X * v.X + Y * v.Y; }
double length() { return sqrt(X * X + Y * Y ); }
vertex normalize( bool &bOk ){
double len = length(); bOk = false;
if( len > MY_EPSILON ){ bOk = true; return vertex( X/len, Y/len ); }
return *this;
}
};
std::ostream & operator << ( std::ostream & s, vertex v ){
s << std::setprecision(6) << "(" << v.X << "," << v.Y << ") ";
return s;
}
Точечное произведение двух векторов:
Чтобы проверить, находится ли прямой угол в точке B, мы можем использовать следующую функцию, она вычислит произведение точек двух нормализованных векторов AB и BC:
bool isRighAngle( vertex a, vertex b, vertex c){
bool bOkAB, bOkBC;
vertex uAB = ( b - a ).normalize( bOkAB ), uBC = ( c - b ).normalize( bOkBC );
return bOkAB && bOkBC && fabs(uAB.dot( uBC )) < MY_EPSILON;
}
Обратите внимание, что когда мы сравниваем двойное значение с нулем, всегда используем эпсилон, для двойного нет абсолютного нуля. Эта функция также возвращает false, если один из нормализованных векторов не может быть вычислен (две точки расположены слишком близко друг к другу).
Вычислить последнюю координату под прямым углом:
Эта следующая функция возвращает true, если последний кординат D рассчитывается по прямому углу B:
bool getLastCoordinateIfRightAngle( vertex a, vertex b, vertex c, vertex & d ){
if( isRighAngle( a, b, c ) ){
d = (a + c) - b;
return true;
}
return false;
}
Ищите правильный угол:
Таким образом, чтобы найти последнюю координату D из 3 вершин A, B и C, вы должны выполнить тест для трех случаев прямого угла, тест останавливается, когда решение найдено:
bool getLastCoordinate( vertex a, vertex b, vertex c, vertex &d ){
if( getLastCoordinateIfRightAngle( a, b, c, d ) //if B is at the right angle
|| getLastCoordinateIfRightAngle( a, c, b, d ) //if C is at the right angle
|| getLastCoordinateIfRightAngle( b, a, c, d ) ) //if A is at the right angle
{
return true;
}
//No right angle found.
return false;
}
Быстрый тест :
Мы можем сделать быстрый тест, если он работает:
int main(int argc, char *argv[])
{
vertex A(0.0, 0.0), B(1.0, 0.0), C(0.0, 1.0), D;
if( getLastCoordinate( A, B, C, D ) ){
std::cout << "D coordinate " << D << " found from inputs : " << A << B << C << std::endl;
}else {
std::cout << "D coordinate not found for input: " << A << B << C << std::endl;
}
return 0;
}
EPSILON CHOICE:
Это зависит от вашего домена: если вы работаете в очень маленьком объектном домене, который (X, Y) очень мал (например, близок к 10E-5), у вас будут некоторые трудности в вычислениях (плавающая точка в GPU очень ограничена в точность). Лучше преобразовать рабочий домен в нормальный диапазон.
В приведенном выше примере EPSILON установлен на 10E-6. Если длина между двумя точками меньше этого значения, эти две точки можно рассматривать как уникальную точку — они остаются в одной и той же позиции).
1
bsitenldefom104
Вопрос по математике:
Точки А(-3,1)В(1,1)С(1,-1) Вершины прямоугольника АВСД Найдите координаты четвертой вершины прямоугольника и вычислите его периметр и площадь,если единичный отрезок 0,5 см ПОМОГИТЕ ПОЖАЛУЙСТА!!!❤️
Трудности с пониманием предмета? Готовишься к экзаменам, ОГЭ или ЕГЭ?
Воспользуйся формой подбора репетитора и занимайся онлайн. Пробный урок – бесплатно!
Ответы и объяснения 1
averampey
Д(-3,-1)
(2+1)•2=6см периметр
2•1=2см/кв площадь
Знаете ответ? Поделитесь им!
Гость ?
Как написать хороший ответ?
Как написать хороший ответ?
Чтобы добавить хороший ответ необходимо:
- Отвечать достоверно на те вопросы, на которые знаете
правильный ответ; - Писать подробно, чтобы ответ был исчерпывающий и не
побуждал на дополнительные вопросы к нему; - Писать без грамматических, орфографических и
пунктуационных ошибок.
Этого делать не стоит:
- Копировать ответы со сторонних ресурсов. Хорошо ценятся
уникальные и личные объяснения; - Отвечать не по сути: «Подумай сам(а)», «Легкотня», «Не
знаю» и так далее; - Использовать мат – это неуважительно по отношению к
пользователям; - Писать в ВЕРХНЕМ РЕГИСТРЕ.
Есть сомнения?
Не нашли подходящего ответа на вопрос или ответ отсутствует?
Воспользуйтесь поиском по сайту, чтобы найти все ответы на похожие
вопросы в разделе Математика.
Трудности с домашними заданиями? Не стесняйтесь попросить о помощи –
смело задавайте вопросы!
Математика — наука о структурах, порядке и отношениях, исторически сложившаяся на основе операций подсчёта, измерения и описания формы объектов.