Если вы отправляете это как домашнее задание, вам могут помочь некоторые элементы стиля. Каковы роли 200, 100 и 300? Это «магические константы», которых следует избегать. Они связаны или это просто шанс, что они имеют эти ценности? Предлагаем вам использовать такие символы, как:
int NPOINTS = 200
;
или
double radius = 100.0
Это покажет, действительно ли 300 было желаемым значением. Я не проверял.
Лично я бы не стал писать
y*-1
но
-y
так как слишком легко ошибиться с первым.
Я бы также распечатал 200 точек в виде числа с плавающей запятой и посмотрел, можно ли на глаз определить, где ошибка. Весьма вероятно, что паразитные линии начерчены либо в начале, либо в конце расчета - легко допустить ошибки «конечного эффекта», когда ровно одна точка пропускается или вычисляется дважды.
Также экспериментировать дешево. Попробуйте перебрать c от 0 до 100, или от 0 до 10, или от 0 до 198, или от 1 до 200. Всегда ли встречается ваша паразитная линия / треугольник?
ОБНОВЛЕНИЕ Вот что я считаю неправильным и как с этим бороться. Вы допустили очень естественную графическую ошибку и ошибку ограждения (http://en.wikipedia.org/wiki/Off-by-one_error)), и трудно определить, что не так, потому что имена ваших переменных выбраны неправильно.
Что такое mypoints
? Я полагаю, что это - нижняя половина белка - если вы назвали это bottomHalf
, то те, кто отвечал на вопрос, обнаружили проблему быстрее :-).
Ваша графическая проблема в том, что вы рисуете ДВА ПОЛОВИНЫ. Вы рисуете ЗАКРЫТЫЕ кривые - когда вы добираетесь до последней точки (c == 199), полигон закрывается, возвращаясь к c == 0. Это делает D-форму. У вас есть две D-формы, одна с выпуклостью ВВЕРХ и одна ВНИЗ. У каждого есть горизонтальная линия, закрывающая многоугольник.
Ваша ошибка поста забора в том, что вы рисуете точки от 0 до 199. Для полукровки вы хотите от 0 до 200. Это 201 балл! Потеря одной точки означает, что у вас очень слегка наклонная линия. Нижние линии наклонены в противоположном направлении от вершины. Это дает вам очень клиновидную форму, которую вы называете треугольником. Я предполагаю, что ваш треугольник на самом деле не замкнут, а похож на кусочек пирога, но очень резкий.
(Код ниже может быть красивее и компактнее. Однако часто бывает полезно разбить симметричные задачи на квадранты или октанты. Было бы также интересно использовать угол для сметания многоугольника).
Вы действительно хотите ОДИН полигон. Код должен быть примерно таким:
int NQUADRANT = 100;
int NPOINTS = 4*NQUADRANT ; // closed polygon
double[] xpoints = new double[NPOINTS];
double[] ypoints = new double[NPOINTS];
Ваша белка в 100, 100 с радиусом 100. Я выбрал разные значения здесь
подчеркнуть, что они не связаны. Используя символические имена, вы можете легко изменять их.
double xcenter = 500.0;
double ycentre = 200.0;
double radius = 100.;
double deltax = radius/(double) NQUADRANT;
// let's assume squircle is centered on 0,0 and add offsets later
// this code is NOT complete or correct but should show the way
// I might have time later
for (int i = 0; i < NPOINTS; i++) {
if (i < NQUADRANT) {
double x0 = -radius + i* deltax;
double y0 = fourthRoot(radius, x0);
x[i] = x0+xcenter;
y[i] = y0+ycenter;
}else if (i < 2*NQUADRANT) {
double x0 = (i-NQUADRANT)* deltax;
double y0 = fourthRoot(radius, x0);
x[i] = x0+xcenter;
y[i] = y0+ycenter;
}else if (i < 3*NQUADRANT) {
double x0 = (i-2*NQUADRANT)* deltax;
double y0 = -fourthRoot(radius, x0);
x[i] = x0+xcenter;
y[i] = y0+ycenter;
}else {
double x0 = -radius + (i-3*NQUADRANT)* deltax;
double y0 = -fourthRoot(radius, x0);
x[i] = x0+xcenter;
y[i] = y0+ycenter;
}
}
// draw single polygon
private double fourthRoot(double radius, double x) {
return Math.sqrt(Math.sqrt(radius*radius*radius*radius - x*x*x*x));
}