Перейти к содержанию
  • Регистрация
  • 0
Авторизация  
Zitto

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

Вопрос

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

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

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

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

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

 

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

Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

  • 0

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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 эмодзи.

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

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

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

Авторизация  

  • Похожий контент

    • От Igor
      Krug1: TCircle лежащий на TabItem4, TabControl1 лежащим на Form1
       
      Проблема в том, что текст кажется рисуется по координатам формы, а не Krug1, или TabItem4, или TabControl1 (заменял в коде krug1.Canvas на TabControl1.Tabs[3].Canvas всё равно по координатам формы рисует).
       
      В теории представляю, что если по координатам круга то TRectF.Create(0, 0, krug1.Width, krug1.Height) должен работать, но нет.
       

       
      В коде (кусок из события Click объекта krug1) ниже по логике в TRectF.Create с опорой на координаты Tab'а, хотя канва krug1, в итоге рисует над TabControl1:
      with krug1.Canvas do begin BeginScene; try Fill.Color := TAlphaColorRec.Red; Fill.Kind := TBrushKind.Solid; Font.Size := 10; FillText(TRectF.Create(krug1.Position.X, krug1.Position.Y, krug1.Position.X+krug1.Width, krug1.Position.Y+krug1.Height), 'Текст', False, 1, [], TTextAlign.Center, TTextAlign.Center); finally EndScene; end; end;
    • От Labian
      Embarcadero® RAD Studio XE6 Version 20.0.16277.1276 
       
      Не работает функция пересечения двух прямоугольников.
      Пытаюсь найти прямоугольник пересечения функцией IntersectRectF.
       
      Пример кода:
        var   R1, R2, ResRect: TRectF; begin   R1 := RectF(6, 3, 3, 6);   R2 := RectF(8, 5, 5, 8);   if IntersectRectF(ResRect, R1, R2) then   begin     ShowMessage(FloatToStr(ResRect.Left) + ' ' + FloatToStr(ResRect.Top) +             ' '+FloatToStr(ResRect.Right) + ' ' + FloatToStr(ResRect.Bottom));   end; end;   Функция возвращает False и в ResRect присваивается значениям 0.
      Хотя очевидно что есть пересечение в виде квадрата 1 на 1.
       
      Как можно еще найти пересечение прямоугольников типа TRectF?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

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