Как найти центр прямоугольника по его координатам

I have drawn a rectangle. I know its (x1,y1) Top Left and (x2,y2) Bottom Right coordinates.. I also have the height h and width w of drawn rectangle.. How can I find the center coordinates (x,y) ?

I am currently using the following formula.

(x,y) = (x2 + x1)/2, (y2+y1)/2

It gives the correct y coordinate but no luck in x.

Lucifer's user avatar

Lucifer

29.3k24 gold badges90 silver badges142 bronze badges

asked Mar 16, 2012 at 9:36

casper123's user avatar

4

The center of rectangle is the midpoint of the diagonal end points of rectangle.

Here the midpoint is ( (x1 + x2) / 2, (y1 + y2) / 2 ).

That means:
xCenter = (x1 + x2) / 2
yCenter = (y1 + y2) / 2

Let me know your code.

Thomas Orlita's user avatar

answered Mar 16, 2012 at 10:12

Prasad G's user avatar

Prasad GPrasad G

6,6927 gold badges42 silver badges65 bronze badges

3

Center x = x + 1/2 of width

Center y = y + 1/2 of height 

If you know the width and height already then you only need one set of coordinates.

dota2pro's user avatar

dota2pro

7,0687 gold badges43 silver badges78 bronze badges

answered Sep 21, 2013 at 11:29

frog's user avatar

frogfrog

3013 silver badges2 bronze badges

0

We can calculate using mid point of line formula,

centre (x,y) =  new Point((boundRect.tl().x+boundRect.br().x)/2,(boundRect.tl().y+boundRect.br().y)/2)

Murtaza Khursheed Hussain's user avatar

answered Nov 21, 2013 at 6:58

Vinayak's user avatar

VinayakVinayak

6,0161 gold badge32 silver badges30 bronze badges

Как найти центральную координату прямоугольника? [закрытый]

Я нарисовал прямоугольник. Я знаю его (x1,y1) верхние левые и (x2,y2) нижние правые координаты.. У меня тоже есть высота h и ширина W нарисованного прямоугольника.. Как найти координаты центра (x, y) ?

в настоящее время я использую следующую формулу.

Он дает правильную координату y, но не повезло в x.

3 ответов

Дайте мне знать ваш код.

центр x =
x + 1/2 ширины
Центр y =
y + 1/2 высоты

Если вы уже знаете ширину и высоту, вам нужен только один набор координат.

Определить центр прямоугольника

Не знаю, как точно называется. Допустим, есть прямоугольник такого вида: введите сюда описание изображения

Как определить его центр? Система координат декартова, координаты каждой вершины известны(x, y). Или подскажите, в какую сторону курить.

Должно работать для любого параллелепипеда:

Достаточно даже 2 противоположных вершин:

user avatar

Всё ещё ищете ответ? Посмотрите другие вопросы с метками математика или задайте свой вопрос.

Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.6.10.42345

Нажимая «Принять все файлы cookie», вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Как найти центр прямоугольника

Я нарисовал прямоугольник. Я знаю его (x1, y1) верхний левый и (x2, y2) нижний правый координаты. У меня также есть высота h и ширина w рисованного прямоугольника. Как найти координаты центра (x, y)?

В настоящее время я использую следующую формулу.

Он дает правильную координату y, но не везет в x.

  1. Выберите вкладку “Главная” панель “Рисование” раскрывающийся список “Прямоугольник” Угол . найти
  2. Продолжайте нажимать клавишу пробела до тех пор, пока не появится курсор

Свойства

Зная стороны прямоугольника, можно вычислить все остальные его параметры, используя следующий ход действий. Периметр прямоугольника представляет собой удвоенную сумму его сторон, поэтому его можно сразу вычислить. P=2(a+b)

Площадь прямоугольника равна произведению его сторон, поэтому ее также можно найти сразу. S=ab

Диагонали в прямоугольнике являются конгруэнтными, каждая из них образует прямоугольный треугольник со сторонами прямоугольника. Из теоремы Пифагора каждая диагональ будет равна квадратному корню из суммы квадратов сторон прямоугольника. (рис. 56.1) d_1=d_2=√(a^2+b^2 )

Из этого же прямоугольного треугольника можно найти углы α и β при диагоналях, зная только стороны прямоугольника. Отношения катетов друг к другу дают тангенс или котангенс углов треугольника, поэтому α и β будут равны арктангенсу отношений сторон, а дальше значение в градусах можно найти, используя таблицы тангенсов. α=arc tan⁡〖b/a〗 β=arc tan⁡〖a/b〗

Углы γ и δ, образованные пересечением диагоналей, как видно из чертежа, через прямоугольный треугольник с полуосью, равны удвоенным значениям α и β соответственно. (рис.56.2) γ=2α δ=2β

Так как углы у прямоугольника все равны друг другу, вокруг него можно описать окружность. Центр окружности будет находиться в точке пересечения диагоналей, и следовательно, радиус описанной окружности будет равен половине диагонали. (рис.56.3) R=d/2=√(a^2+b^2 )/2

Не знаю, как точно называется. Допустим, есть прямоугольник такого вида:
введите сюда описание изображения

Как определить его центр? Система координат декартова, координаты каждой вершины известны(x, y). Или подскажите, в какую сторону курить.

задан 10 авг 2017 в 23:23

Range's user avatar

4

Должно работать для любого параллелепипеда:

xc = average(x0, x1, x2, x3)
yc = average(y0, y1, y2, y3)

Достаточно даже 2 противоположных вершин:

xc = average(x0, x1)
yc = average(y0, y1)

ответ дан 10 авг 2017 в 23:38

Zergatul's user avatar

ZergatulZergatul

11.3k1 золотой знак19 серебряных знаков32 бронзовых знака

1

Я нарисовал прямоугольник. Я знаю его (x1,y1) верхние левые и (x2,y2) нижние правые координаты.. У меня тоже есть высота h и ширина W нарисованного прямоугольника.. Как найти координаты центра (x, y) ?

в настоящее время я использую следующую формулу.

(x,y) = (x2 + x1)/2, (y2+y1)/2

Он дает правильную координату y, но не повезло в x.

3 ответов


The center of rectangle is the mid point of the diagonal end points of rectangle. 
Here the midpoint is ( (x1 +x2)/2 ,(y1 + y2)/2 ).
that means xCenter = (x1 +x2)/2
           yCenter = (y1 + y2)/2

Дайте мне знать ваш код.


центр x =
x + 1/2 ширины
Центр y =
y + 1/2 высоты

Если вы уже знаете ширину и высоту, вам нужен только один набор координат.


мы можем рассчитать, используя среднюю точку формулы линии,

centre (x,y) =  new Point((boundRect.tl().x+boundRect.br().x)/2,(boundRect.tl().y+boundRect.br().y)/2)

Asdf

1 / 1 / 0

Регистрация: 18.03.2012

Сообщений: 110

1

Нахождение центра прямоугольника

28.10.2012, 20:38. Показов 9916. Ответов 40

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Добрый вечер! Стокнулся с проблемой, на двойном клике мыши в центре последнего нарисованного прямоугольника надо вывести его площдь (в пикселях в квадрате). Так вот, есть код, который рисует прямоугольники и всё такое, только как найти центр прямоугольника?

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
LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
 
    int static BGNx, BGNy, ENDx, ENDy;
    HDC hdc;
    //PAINTSTRUCT ps;
  switch(Message)
  {
        case WM_RBUTTONDOWN:
        hdc = GetDC(hwnd);
        BGNx = LOWORD(lparam);//Координаты левого верхнего угла
        BGNy = HIWORD(lparam);
        ReleaseDC(hwnd, hdc);
        break;
    case WM_RBUTTONUP:
        hdc = GetDC(hwnd);
        ENDx = LOWORD(lparam);//Координаты правого нижнего угла
        ENDy = HIWORD(lparam);
        HBRUSH hBrush; //Создаём кисть
        hBrush = CreateSolidBrush(RGB(0,255,0));
        SelectObject(hdc, hBrush);
        Rectangle(hdc, BGNx, BGNy, ENDx, ENDy);
        DeleteObject(hBrush);
        ReleaseDC(hwnd, hdc);
        break;

Даже специально написал код для вывода координат мыши, но на двойном щелчке не работает, только на одинарном

C++
1
2
3
4
5
6
7
8
case WM_LBUTTONDOWN:
        hdc = GetDC (hwnd);
        char buff[60];
        int y,x;
            y= HIWORD(lparam);
            x= LOWORD(lparam);
              TextOut  (hdc, x,y, buff,
               wsprintf (buff, "x = %d  y = %d", x,y)) ;//Выводим координаты мыши



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

28.10.2012, 20:38

Ответы с готовыми решениями:

Вращение прямоугольника вокруг центра.
Есть программа, которая вращает прмоугольник вокруг центра, но она для АВС.
Переделываю ее под…

Вращение прямоугольника вокруг центра
Помогите,пожалуйста. Прямоугольник нарисовала без проблем)как вращать вокруг одной из вершин знаю,…

Найти координаты всех вершин прямоугольника и его центра
Дано (x0, y0) – координаты нижнего левого угла прямоугольника, стороны которого параллельны осям…

Определить координаты центра, радиус и площадь круга, описанное вдоль прямоугольника
Помогите написать программы, очень срочно!Пожалуйста, очень сильно прошу! На С#

1) Даны (x0, y0,…

40

castaway

Эксперт С++

4981 / 3088 / 456

Регистрация: 10.11.2010

Сообщений: 11,165

Записей в блоге: 10

28.10.2012, 20:40

2

Цитата
Сообщение от Asdf
Посмотреть сообщение

только как найти центр прямоугольника?

C++
1
2
cx = BGNx + ((ENDx - BGNx) / 2);
cy = BGNy + ((ENDy - BGNy) / 2);



0



Asdf

1 / 1 / 0

Регистрация: 18.03.2012

Сообщений: 110

28.10.2012, 20:55

 [ТС]

3

Блин… На одинарный щелчёк всё супер, показывает текст в центре прямоугольника, а на двойной не получается… Или я что-то не так пишу

C++
1
2
3
4
5
6
7
8
case WM_LBUTTONDOWN:
        hdc = GetDC (hwnd);
        char buff[60];
        int cx,cy;
            cx = BGNx + ((ENDx - BGNx) / 2);
            cy = BGNy + ((ENDy - BGNy) / 2);
              TextOut  (hdc, cx,cy, buff,
               wsprintf (buff, "S=a*b=%d", cx,cy)) ;



0



Эксперт С++

4981 / 3088 / 456

Регистрация: 10.11.2010

Сообщений: 11,165

Записей в блоге: 10

28.10.2012, 20:58

4

Двойной щелчек обрабатывается сообщением WM_LBUTTONDBLCLK.
При этом класс окна должен быть зарегистрирован со стилем CS_DBLCLKS.



1



1 / 1 / 0

Регистрация: 18.03.2012

Сообщений: 110

28.10.2012, 22:40

 [ТС]

5

Незнал Спасибо, то что нужно

Добавлено через 8 минут
А как теперь найти 2 стороны прямоугольника, чтобы вычислить площадь? Возможно изза того, что я не создавал ограниченную область для мыши, может мне будет выводить только площадь всего экрана? Обьясните данную часть



0



Эксперт С++

4981 / 3088 / 456

Регистрация: 10.11.2010

Сообщений: 11,165

Записей в блоге: 10

28.10.2012, 22:43

6

Стороны какого прямоугольника? Который ты обозначаешь через BGNx и BGNy ?



0



1 / 1 / 0

Регистрация: 18.03.2012

Сообщений: 110

28.10.2012, 22:47

 [ТС]

7

Ммм… Нет, программа рисует не 1 прямоугольник, а много прямоугольников и чтобы по любому на 2-ой клик вывело его площадь. Хотя… Да, через верний левый угол, BGNx, BGNy



0



Эксперт С++

4981 / 3088 / 456

Регистрация: 10.11.2010

Сообщений: 11,165

Записей в блоге: 10

28.10.2012, 22:53

8

Площадь считается так: (ENDx – BGNx) * (ENDy – BGNy)



1



1 / 1 / 0

Регистрация: 18.03.2012

Сообщений: 110

29.10.2012, 00:13

 [ТС]

9

Всё спс, работает как надо



0



Эксперт С++

4981 / 3088 / 456

Регистрация: 10.11.2010

Сообщений: 11,165

Записей в блоге: 10

29.10.2012, 00:14

10

Пожалуйста



0



1 / 1 / 0

Регистрация: 18.03.2012

Сообщений: 110

29.10.2012, 00:20

 [ТС]

11

Ещё 1 вопрос, чтобы каждый раз, рисуя новый прямоугольник, цвет его менялся, хотябы была череда, зелёный и красный, что надо добавить? Пробовал ещё 1 кисть добавлять, ругается… Как ещё правильно добавить? Через MW_PAINT?



0



Эксперт С++

4981 / 3088 / 456

Регистрация: 10.11.2010

Сообщений: 11,165

Записей в блоге: 10

29.10.2012, 00:23

12

Цитата
Сообщение от Asdf
Посмотреть сообщение

Пробовал ещё 1 кисть добавлять, ругается… Как ещё правильно добавить? Через MW_PAINT?

Покажи как пробовал, лучше код целиком.



0



Asdf

1 / 1 / 0

Регистрация: 18.03.2012

Сообщений: 110

29.10.2012, 00:38

 [ТС]

13

Примерно выглядело вот так, таким способом добавлял.

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
LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
    char szKoord[20], *buff;
    buff=szKoord;
    int static BGNx, BGNy, ENDx, ENDy;
    HDC hdc;
    PAINTSTRUCT ps;
  switch(Message)
  {
        case WM_RBUTTONDOWN:
        hdc = GetDC(hwnd);
        BGNx = LOWORD(lparam);
        BGNy = HIWORD(lparam);
        ReleaseDC(hwnd, hdc);
        break;
    case WM_RBUTTONUP:
        hdc = GetDC(hwnd);
        ENDx = LOWORD(lparam);
        ENDy = HIWORD(lparam);
 
        HBRUSH hBrush1 = CreateSolidBrush(RGB(255,0,0));
                       HBRUSH hBrush;
        hBrush = CreateSolidBrush(RGB(0,255,0));
        SelectObject(hdc, hBrush);
        Rectangle(hdc, BGNx, BGNy, ENDx, ENDy);
 
        SelectObject(hdc, hBrush1);
        Rectangle(hdc, BGNx, BGNy, ENDx, ENDy);
        DeleteObject(hBrush);
        DeleteObject(hBrush1);
        ReleaseDC(hwnd, hdc);
        break;

Добавлено через 7 минут
Способ правда грубый, но идея вроде была правильной.



0



Эксперт С++

4981 / 3088 / 456

Регистрация: 10.11.2010

Сообщений: 11,165

Записей в блоге: 10

29.10.2012, 00:41

14

Создать кисть ты можешь где угодно.
Выбрать кисть для контекста ты можешь при помощи функции SelectObject( hDC, hBrush );
Рисовать правильнее в WM_PAINT.
Функция InvalidateRect( … ) посылает процедуре окна сообщение WM_PAINT, в котором все и рисуется.
Советую прорисовку всего вынести в отдельную функцию, так будет понятнее.



0



1 / 1 / 0

Регистрация: 18.03.2012

Сообщений: 110

29.10.2012, 19:53

 [ТС]

15

Окей, попробуем

Добавлено через 19 часов 0 минут
Блин… Что-то в голову не лезет… Вот смотри, допустим вынесу я в отдельную функцию прорисовку, к примеру DrawRectangles(), как мне написатЬ, что я хочу в этой функции перерисовать именно прямоугольник BGNx, BGNy, а не какой то ещё рисовать на WM_PAINT? Пока мыслей нет…



0



Эксперт С++

4981 / 3088 / 456

Регистрация: 10.11.2010

Сообщений: 11,165

Записей в блоге: 10

29.10.2012, 19:59

16

Цитата
Сообщение от Asdf
Посмотреть сообщение

как мне написатЬ, что я хочу в этой функции перерисовать именно прямоугольник BGNx, BGNy, а не какой то ещё рисовать на WM_PAINT?

А как ты это указывал без функции?



0



Asdf

1 / 1 / 0

Регистрация: 18.03.2012

Сообщений: 110

29.10.2012, 20:38

 [ТС]

17

Просто получается, что ещё раз придёться обьявлять эти 2 переменые или это не обязательно?

C++
1
2
3
4
5
6
case WM_RBUTTONDOWN:
        hdc = GetDC(hwnd);
        BGNx = LOWORD(lparam);
        BGNy = HIWORD(lparam);
        ReleaseDC(hwnd, hdc);
        break;

Добавлено через 3 минуты
Я не имел ввиду, что без функции делал, просто как сделать? Добавить WM_PAINT и в ней все прорисовки делать?



0



Эксперт С++

4981 / 3088 / 456

Регистрация: 10.11.2010

Сообщений: 11,165

Записей в блоге: 10

29.10.2012, 20:45

18

Попробуй не создавать функцию, просто объяви WM_PAINT и перенеси туда всю прорисовку из WM_RBUTTONUP, а заместо неё добавь InvalidateRect().



0



1 / 1 / 0

Регистрация: 18.03.2012

Сообщений: 110

29.10.2012, 21:01

 [ТС]

19

Так, окей, тогда как сделать, чтобы + ещё 1 цвет добавлялся, ну не только зелёным красил ,а чередовал?

Добавлено через 1 минуту
Т.е. добавляю новую кисть hBrush1 к примеру, выбираю через SelectObject(hdc, hBrush1), и как привязать к своему прямоугольнику новую кисть?



0



Эксперт С++

4981 / 3088 / 456

Регистрация: 10.11.2010

Сообщений: 11,165

Записей в блоге: 10

29.10.2012, 21:03

20

Ну задай статическую переменную = 0;
После нажатия проверяй:
если она == 0, рисуй одним цветом, изменяй на 1
если она == 1, рисуй другим цветом, изменяй на 0

Добавлено через 1 минуту

Цитата
Сообщение от Asdf
Посмотреть сообщение

как привязать к своему прямоугольнику новую кисть?

Создай структуру/класс в котором опиши прямоугольник и его цвет.



0



Добавить комментарий