Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2022, 08:39   #11
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
Белого прямоугольника? может рабочей области окна?
см. картинку. Белым фоном закрашен прямоугольник, внутри которого рисуется эллипс. Относительно его левого верхнего угла вычисляется cen. Что позволяет сохранить в этой переменной два значения разом (они из-за этого численно совпадают). На картинке padding выбран одинаковый со всех сторон окна из-за этого центр прямоугольника совпадает с центром окна. Но если padding будет выбран например такой RECT padding = Rect(0, 0, 250, 0); // Отступ 250 пикселей только от правой стороны окна, то центр не будет совпадать с центром окна, но все еще будет центром прямоугольной области и радиусами эллипса.

Последний раз редактировалось macomics; 11.10.2022 в 08:44.
macomics вне форума Ответить с цитированием
Старый 11.10.2022, 09:58   #12
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
Код:
int cxHalfEllipse = (cxEllipse >> 1);
		SetRect(&rcArc, cxHalfClient - cxHalfEllipse,
			cyHalfClient - 100,
			cxHalfClient + cxHalfEllipse,
			cyHalfClient + 100);
		cyEllipse = rcArc.bottom - rcArc.top;
А чему равно значение cxEllipse, когда вы вычисляете cxHalfEllipse? И почему применяете 100, а не cyHalfEllipse?


Цитата:
Сообщение от apofioz Посмотреть сообщение
Код:
POINT pCenter = { ((rcArc.left + rcArc.right) >> 1),
						 ((rcArc.top + rcArc.bottom) >> 1)
		};
		int x0 = (int)(pCenter.x + 0.5 * (cxEllipse));
		int y0 = pCenter.y;
		int x = (int)(pCenter.x + 0.5 * (cxEllipse) * cos(PI * 0.1));
		int y = (int)(pCenter.y - 0.5 * (cyEllipse) * sin(PI * 0.1));
Вы не учитываете то, что pCenter вычислен относительно левого верхнего угла rcArc, а не окна.
macomics вне форума Ответить с цитированием
Старый 11.10.2022, 11:56   #13
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
А чему равно значение cxEllipse, когда вы вычисляете cxHalfEllipse?
Четверти ширины окна. Просто так захотелось.
Код:
case WM_SIZE:
	{
		cxClient = LOWORD(lParam);
		cyClient = HIWORD(lParam);
		cxEllipse = (int)(cxClient * 0.25);

		return 0;
	}

Цитата:
Сообщение от macomics Посмотреть сообщение
И почему применяете 100, а не cyHalfEllipse?
Тоже самое решил попробовать задать такие координаты, посмотреть, что из этого получится.


Цитата:
Сообщение от macomics Посмотреть сообщение
А чему равно значение cxEllipse, когда вы вычисляете cxHalfEllipse? И почему применяете 100, а не cyHalfEllipse?



Вы не учитываете то, что pCenter вычислен относительно левого верхнего угла rcArc, а не окна.
Я полагал, что мне нужно вычислить координаты относительно заданной фигуры, а не окна. Мне показалось так удобней.
Начало x0 = 0/2pi,
y0 = cyEllipse / 2; - высота эллипса пополам, что не так?

Почему центр должен быть вычислен относительно середины окна, в чём плюс, если моя фигура меньше, гораздо меньше размеров окна...
apofioz вне форума Ответить с цитированием
Старый 11.10.2022, 11:59   #14
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Функция, которую рекомендовали FloodFill , у меня не работает.
apofioz вне форума Ответить с цитированием
Старый 11.10.2022, 12:06   #15
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
Почему центр должен быть вычислен относительно середины окна, в чём плюс, если моя фигура меньше, гораздо меньше размеров окна...
Центр должен быть вычислен относительно фигуры, но вы его применяете так как будто он вычислен относительно окна
Цитата:
Сообщение от apofioz Посмотреть сообщение
Код:
x = (int)(pCenter.x + 0.5 * (cxEllipse) * cos(PI * 0.65));
		y = (int)(pCenter.y - 0.5 * (cyEllipse) * sin(PI * 0.65));
Вычислили координаты X и Y относительно фигуры а не окна и далее

Цитата:
Сообщение от apofioz Посмотреть сообщение
Код:
Arc(hdc, rcArc.left, rcArc.top, rcArc.right, rcArc.bottom, x0, y0, x, y);
применяете их как значения относительно окна (С X0 и Y0 тоже самое замечание)
Цитата:
Сообщение от apofioz Посмотреть сообщение
Функция, которую рекомендовали FloodFill , у меня не работает.
А как именно вы ее применили?

Последний раз редактировалось macomics; 11.10.2022 в 12:09.
macomics вне форума Ответить с цитированием
Старый 11.10.2022, 12:24   #16
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Центр должен быть вычислен относительно фигуры, но вы его применяете так как будто он вычислен относительно окна
А как правильно нужно делать, если исходить из тех вычислений, которые я произвёл?


Цитата:
Сообщение от macomics Посмотреть сообщение
Вычислили координаты X и Y относительно фигуры а не окна
"Стало гораздо понятнее" - ещё больше запутался и всё.


Цитата:
Сообщение от macomics Посмотреть сообщение
применяете их как значения относительно окна (С X0 и Y0 тоже самое замечание)
Тоже самое.
apofioz вне форума Ответить с цитированием
Старый 11.10.2022, 12:32   #17
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
x = (int)(pCenter.x + 0.5 * (cxEllipse) * cos(PI * 0.65));
y = (int)(pCenter.y - 0.5 * (cyEllipse) * sin(PI * 0.65));
Если rcArc содержит координаты фигуры, тогда надо так
Код:
Arc(hdc, rcArc.left, rcArc.top, rcArc.right, rcArc.bottom, rcArc.left + x0, rcArc.top + y0, rcArc.left + x, rcArc.top + y);
Теперь x3, y3, x4, y4 передаются в виде значений относительно окна, а не фигуры. Как было у вас. Подобную правку вам надо сделать во всех функциях (MoveTo, LineTo, TextOut, FloodFill).

Последний раз редактировалось macomics; 11.10.2022 в 12:35.
macomics вне форума Ответить с цитированием
Старый 11.10.2022, 12:52   #18
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Если rcArc содержит координаты фигуры, тогда надо так
А так не пойдёт:
Код:
x0 = rcArc.left + round(0.5 * cxEllipse);
y0 = rcArc.top + cyEllipse / 2;                 

x = (rcRac.left + round(0.5 * cxEllipse * cos(2 * PI * 0.65)));
x = (rcRac.top  + round(0.5 * cyEllipse * sin(2 * PI * 0.65)));
Правильно ли я уловил вашу мысль?

Последний раз редактировалось apofioz; 11.10.2022 в 13:12.
apofioz вне форума Ответить с цитированием
Старый 11.10.2022, 13:07   #19
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Это не моя мысль, а требования к параметрам у функции. Да так тоже можно. Только у y0 тоже надо добавить rcArc.top
macomics вне форума Ответить с цитированием
Старый 11.10.2022, 13:10   #20
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
FloodFill
Цитата:
Сообщение от macomics Посмотреть сообщение
А ничего что новую область диаграммы надо откладывать от правой границы старой. т.е. первый сегмент 10%, тогда второй сегмент будет 10 + 65 = 75%
А третий получается 10 + 65 + 25 = 100% - так?
Зачем тогда сохранять x и y. Я, думал, что прорисовка происходит как-то так для того и сохраняются x и y.
Фигура.jpg
apofioz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нарисовать круговую диаграмму Proskurina Паскаль, Turbo Pascal, PascalABC.NET 2 08.11.2012 08:50
Нарисовать столбиковую диаграмму по результатам сдачи экзамена по матану Proskurina Паскаль, Turbo Pascal, PascalABC.NET 8 07.11.2012 23:14
Нарисовать столбиковую диаграмму Proskurina Помощь студентам 2 24.10.2012 13:40
Нарисовать диаграмму сравнения методов Gebbellz Помощь студентам 0 15.12.2010 17:52
нарисовать круговую диаграмму в паскале vbchristy46 Помощь студентам 2 28.06.2010 20:33