Как я могу перевести этот код C # в Java - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь проверить код подразделения Де-Кастельжау. Однако мой пример в C #, и я хочу проверить его в Java, так как я не знаю, C #.

Особенно последнее возвращение вызывает у меня проблемы, так как я не могу понять это правильно. Я использую Vec2D вместо точки, представляющей основные 2d векторы. В этом случае я представляю точки с массивом Vec2D. У меня есть методы, такие как "getX", чтобы получить часть x, но если я просто изменю ее в последней строке, она потерпит неудачу. Подводя итог, я обменял «Точку» на Vec2D [] и p1.X на p1.getX.

private void drawCasteljau(List<point> list)
{
    Point tmp;
    for (double t = 0; t & lt;= 1; t += 0.001) {
        tmp = getCasteljauPoint(points.Count - 1, 0, t);
        image.SetPixel(tmp.X, tmp.Y, color);
    }
}

private Point getCasteljauPoint(int r, int i, double t)
{
    if (r == 0) return points[i];

    Point p1 = getCasteljauPoint(r - 1, i, t);
    Point p2 = getCasteljauPoint(r - 1, i + 1, t);

    return new Point((int)((1 - t) * p1.X + t * p2.X), (int)((1
                             - t) * p1.Y + t * p2.Y));
}

Моя попытка:

public Vec2D[] getCasteljauPoint(int r, int i, double t) { 
    if(r == 0) return new Vec2D[i];

    Vec2D[] p1 = getCasteljauPoint(r - 1, i, t);
    Vec2D[] p2 = getCasteljauPoint(r - 1, i + 1, t);


    return new Vec2D(((1/2) * p1.getX + (1/2) * p2.getX),  ((1/2)                        
                        * p1.getY + (1/2) * p2.getY));
}

Я чувствую, что должны быть небольшие изменения, чтобы начать, но я застрял. Сообщение об ошибке в последней строке говорит - getX не может быть разрешен или не является полем - Несоответствие типов: невозможно преобразовать Vec2D в Vec2D []

1 Ответ

0 голосов
/ 10 июля 2019

Вы объявляете p1 и p2 как Vec2D массивы, и в вашем определении метода указан тип возвращаемого массива Vec2D.Однако внутри вашего метода вы возвращаете единственный объект Vec2D.

Потенциальное решение:

public class SomeJavaClassName 
{ 
    ArrayList<Vec2D> points = new ArrayList<String>();

    // Other methods, properties, variables, etc.,
    // some of which would populate points

    public Vec2D getCasteljauPoint(int r, int i, double t) { 
        // points[] is declared outside just like in the C# code
        if(r == 0) return points.get(i);

        Vec2D p1 = getCasteljauPoint(r - 1, i, t);
        Vec2D p2 = getCasteljauPoint(r - 1, i + 1, t);

        return new Vec2D(((1/2) * p1.getX + (1/2) * p2.getX), ((1/2)
                            * p1.getY + (1/2) * p2.getY));
    }
}
...