2014-10-13 3 views
2

мне нужно нарисовать дугу в андроиде с различной толщиной, как показано на рисунке ниже,Как нарисовать дугу с различной толщиной

Arc from from some startDegree to endDegree with varying thickness

Можно ли нарисовать дугу и закрепить его? поскольку дуга может находиться между любыми градусами (startDegree to endDegree), я не могу добиться этого с помощью пути.

поэтому мое требование что-то вроде этого,

example code snippet

Пожалуйста, помогите мне достичь выше.

+0

это ** мощь ** помощь: HTTP: //stackoverflow.com/a/4200799/3436942 – jbutler483

+0

@ jbutler483, я могу нарисовать дугу с помощью следующего фрагмента кода 'холст .drawArc (rectangleF, startDegree, endDegree, false, paint); 'но дуга имеет одинаковую толщину, мне нужно, чтобы она была с разной толщиной начала и конца –

ответ

1

Я думаю, вы можете сделать это с помощью Path

Вы дуга имеет края, как:

  • горизонтальная прямая линия
  • верхняя дуга
  • вертикальной прямой
  • нижней дуги

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

UPD:
Пожалуйста, обратите внимание на this question Кажется, я нашел точную формулу для этой кривой.

UPD 2:
О том, как нарисовать спираль на холсте, я думаю, не очень плохое решение сделать как here (там используется JavaScript, но это не имеет значения - идея та же). Единственное: необходимо написать спиральное уравнение в декартовой системе координат. Попытайтесь сделать это самостоятельно. Если вы потерпите неудачу, спросите меня.

UPD 3: Проверьте упомянутый раздел UPD2 вопроса, чтобы найти параметризацию декартовой системы координат. Это может содержать ошибки, я не проверял их сам, но идея должна быть ясной.

Надеюсь, это поможет.

+0

да, я могу нарисовать две линии горизонтальной или вертикальной (на основе угла) и дугу (верхняя дуга). но я не могу нарисовать нижнюю дугу из-за двух проблем, точка 1.centre для нижней дуги должна быть разной в зависимости от угла, 2. Максимальная толщина дуги должна достигать только в конце. –

+1

Я думаю, что первая проблема, которую вам лучше спросить здесь: http: //math.stackexchange.com/ – krossovochkin

+0

Я предполагаю, что это может быть достигнуто за счет верхней дуги с постоянным радиусом и дуги с переменными (уменьшающимися) радиусами, другими словами, внутренняя может быть похожа на спираль. –

0

Следующая функция будет работать, имея в виду угол в градусах для преобразования в радианы. Пожалуйста, измените тип данных в два раза:

void spiralArc(int startAngle, ind endAngle, int centreX, int centreY,int radius, int maxThickness) 
{ 
    int iRadius; 
    for(int ang=startAngle;ang<=endAngle;ang++) 
    { 
     iRadius = radius - (int)((double) maxThickness*(double)ang/(double)endAngle); 
     drawLine(centreX+(radius*cos(ang)), centreY+(radius*sin(ang)), centreX+(iradius*cos(ang)), centreY+(iradius*sin(ang))) 
    } 
} 
Смежные вопросы