Android Как нарисовать треугольники внутри шестиугольника? - PullRequest
0 голосов
/ 02 апреля 2020

Сначала я нарисовал три линии ширины шестиугольника, определяющих c width, а затем я нарисовал шесть точек, используя эту формулу section = 2 * PI / NumberOfPoints. Вот пи c линий, которые я нарисовал:

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

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

Вот как я нарисовал линии:

 for (int i = 1; i <= 6; i++) {

        float eX = (float) (x + radius * Math.cos(section * i));

        float eY = (float) (y + radius * Math.sin(section * i));

        linesPaint.setShader(new LinearGradient(x, y, eX, eY, Color.BLACK, Color.TRANSPARENT, Shader.TileMode.MIRROR));

        canvas.drawLine(x, y, eX, eY, linesPaint);

    }

и вот как я нарисовал треугольники

 for (int i = 1; i <= 6; i++) {

        TriangleColor triangleColor = triangleColors.get(i - 1);

        trianglesPaint.setShader(new LinearGradient(0, 0, 0, getHeight(), triangleColor.firstColor, triangleColor.secondColor, Shader.TileMode.REPEAT));

        float x1 = (float) (x + radius * Math.cos(section * i));

        float y1 = (float) (y + radius * Math.sin(section * i));

        float x2 = (float) (x + radius * Math.cos(section * (i + 1)));

        float y2 = (float) (y + radius * Math.sin(section * (i + 1)));

        trianglesPath.moveTo(x, y);

        trianglesPath.lineTo(x1, y1);

        trianglesPath.lineTo(x2, y2);

        trianglesPath.lineTo(x, y);

        canvas.drawPath(trianglesPath, trianglesPaint);

        trianglesPath.reset();
    }

Может кто-нибудь помочь мне с формула? Заранее спасибо.

1 Ответ

0 голосов
/ 03 апреля 2020

Я предполагаю, что у вас есть линии толщиной 2d

Чтобы избежать перезаписи этих линий, вы можете сместить центральную точку для каждого треугольника на dstance d/sin(30) = 2*d в направлении биссектрисы между двумя линиями

Возможно, также вам нужно dimini sh радиус (длина стороны треугольника вдоль линии)

newradius = radius - d*sqrt(3) - d * sqrt(3)/3 

enter image description here

for (int i = 1; i <= 6; i++) {

    cx = x + 2 * d * Math.cos(section * (i + 0.5));
    cy = x + 2 * d * Math.sin(section * (i + 0.5));

    float x1 = (float) (cx + newradius * Math.cos(section * i));  /
    //and similar  for other coordinates

    trianglesPath.moveTo(cx, cy);

    trianglesPath.lineTo(x1, y1);
    ...
...