Перейти к содержанию
Fire Monkey от А до Я
  • 0

Координаты центральной точки в закрашенной области.


Zitto

Вопрос

Приветствую!

Собрался недавно сделать свою круговую диаграмму.

Решил собрать из TPie и все вроде бы хорошо, но при желании проставить значения в закрашенный кусок диаграммы поймал себя на мысли,

что найти центр закрашенной области не так то просто.

Отсюда вопрос: Возможно есть готовое решение по поиску этих координат или, возможно, даже стандартная реализация через TRectF ?

 

Смотрю, предыдущая тема похожа, и похоронена. Надеюсь мне повезет больше.

Спасибо!

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Задается прямоугольник, который имеет прозрачную и закрашенную область. Наложением друг на друга можно построить полноценную диаграмму.

Часть закрашенной окружности образуется начальным и конечным углом окружности.

Ссылка на комментарий
  • 0

Увы все не так просто. Идейно ясно, что середина любой закрашенной области на окружности находится в радиусе в два раза меньшем радиусу основной окружности.

Всплывает необходимость переноса градусов на оси Х,У с учетом смещения выделенной области и периодами Pi.

Что я в принципе и сделал, но результат не устраивает, поэтому ищу другую реализацию, возможно, заложенную в компонент. 

Ссылка на комментарий
  • 0

Картинка для наглядности.

Имеем компонент TPie, с высотой и шириной равной 100, координаты X=50;Y=50;

Начальный угол 0, конечный 232.

Радиус получается 50. Центр TText будет лежать на окружности с радиусом 25.

Известен угол на котором должна располагаться надпись, в данном случае это 116.

В идеале должна быть формула выявления координат X,Y для TText.

В реальности же приходится учитывать факт что треугольника, как такового может и не быть.

В довесок, следующая область имеет отличный от 0 начальный угол (232), что делает необходимым учет четвертей.   

post-457-0-58375400-1452263400.jpg

Ссылка на комментарий
  • 0
R := 80;
  Canvas.BeginScene();


  Alpha := ((Sender as TPie).EndAngle+(Sender as TPie).StartAngle)/2;
  dX := (Sender as TPie).Width /2+ R * Cos(DegToRad(Alpha));
  dY := (Sender as TPie).Height/2 +R * Sin(DegToRad(Alpha));
  rct.Create(dX-5,dY-5,dX+5,dY+5);
  Canvas.DrawEllipse(rct,100);
  Canvas.EndScene();

Ссылка на комментарий
  • 0
R := 80;
  Canvas.BeginScene();


  Alpha := ((Sender as TPie).EndAngle+(Sender as TPie).StartAngle)/2;
  dX := (Sender as TPie).Width /2+ R * Cos(DegToRad(Alpha));
  dY := (Sender as TPie).Height/2 +R * Sin(DegToRad(Alpha));
  rct.Create(dX-5,dY-5,dX+5,dY+5);
  Canvas.DrawEllipse(rct,100);
  Canvas.EndScene();

Благодарю!

Сам делал чуть по другому.

Ошибка была -отрицательные углы переводил в положительные.

Может кому будет полезно:

function pr( _r: Single; _sA: Single; _eA: Single; _Text: TText ): TPoint;
  Var
    i: Integer;
    t: real;
    r: real;  
  Begin
    r := _r / 2; //Радиус внутренней окружности
    i := Round( _eA - ( _eA - _sA )/2 );
    Begin
      t := i * pi / 180;
      Result := TPoint.Create(
        Round( r * cos( t )  + _r - Round( _Text.Width / 2 ) ),
        Round( r * sin( t ) + _r - Round( _Text.Height /2 ) ) );
      //Дополнительная корректировка на центр TText, при TText.WordWrap = False и TText.AutoSize := True
    End;
  End;
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...