Я хочу нарисовать дугу, используя центральную точку, начальную точку, конечную точку на opengl surfaceview. Я пробовал это ниже под кодом. Эта функция рисует ожидаемую дугу, если мы даем значение для start_line_angle и end_line_angle вручную (как start_line_angle = 0 и end_line_angle = 90) в градусах.Нарисуйте дугу в opengl GL10
Но мне нужно, чтобы нарисовать дугу с заданными координатами (центральную точку, начальную точку, конечную точку) и вычисляя start_line_angle и end_line_angle программно. Эта функция рисует дугу с заданными параметрами, но не дает результат желания. Я потратил 2 дня на это. Заранее спасибо.
private void drawArc(GL10 gl, float radius, float cx, float cy, float start_point_x, float start_point_y, float end_point_x, float end_point_y) {
gl.glLineWidth(1);
int start_line_angle;
double sLine = Math.toDegrees(Math.atan((cy - start_point_y)/(cx - start_point_x))); //normal trigonometry slope = tan^-1(y2-y1)/(x2-x1) for line first
double eLine = Math.toDegrees(Math.atan((cy - end_point_y)/(cx - end_point_x))); //normal trigonometry slope = tan^-1(y2-y1)/(x2-x1) for line second
//cast from double to int after round
int start_line_Slope = (int) (sLine + 0.5);
/**
* mapping the tiriogonometric angle system to glsurfaceview angle system
* since angle system in trigonometric system starts in anti clockwise
* but in opengl glsurfaceview angle system starts in clock wise and the starting angle is 90 degree of general trigonometric angle system
**/
if (start_line_Slope <= 90) {
start_line_angle = 90 - start_line_Slope;
} else {
start_line_angle = 360 - start_line_Slope + 90;
}
// int start_line_angle = 270;
// int end_line_angle = 36;
//casting from double to int
int end_line_angle = (int) (eLine + 0.5);
if (start_line_angle > end_line_angle) {
start_line_angle = start_line_angle - 360;
}
int nCount = 0;
float[] stVertexArray = new float[2 * (end_line_angle - start_line_angle)];
float[] newStVertextArray;
FloatBuffer sampleBuffer;
// stVertexArray[0] = cx;
// stVertexArray[1] = cy;
for (int nR = start_line_angle; nR < end_line_angle; nR++) {
float fX = (float) (cx + radius * Math.sin((float) nR * (1 * (Math.PI/180))));
float fY = (float) (cy + radius * Math.cos((float) nR * (1 * (Math.PI/180))));
stVertexArray[nCount * 2] = fX;
stVertexArray[nCount * 2 + 1] = fY;
nCount++;
}
//taking making the stVertextArray's data in reverse order
reverseArray = new float[stVertexArray.length];//-2 so that no repeatation occurs of first value and end value
int count = 0;
for (int i = (stVertexArray.length)/2; i > 0; i--) {
reverseArray[count] = stVertexArray[(i - 1) * 2 + 0];
count++;
reverseArray[count] = stVertexArray[(i - 1) * 2 + 1];
count++;
}
//reseting the counter to initial value
count = 0;
int finalArraySize = stVertexArray.length + reverseArray.length;
newStVertextArray = new float[finalArraySize];
/**Now adding all the values to the single newStVertextArray to draw an arc**/
//adding stVertextArray to newStVertextArray
for (float d : stVertexArray) {
newStVertextArray[count++] = d;
}
//adding reverseArray to newStVertextArray
for (float d : reverseArray) {
newStVertextArray[count++] = d;
}
Log.d("stArray", stVertexArray.length + "");
Log.d("reverseArray", reverseArray.length + "");
Log.d("newStArray", newStVertextArray.length + "");
ByteBuffer bBuff = ByteBuffer.allocateDirect(newStVertextArray.length * 4);
bBuff.order(ByteOrder.nativeOrder());
sampleBuffer = bBuff.asFloatBuffer();
sampleBuffer.put(newStVertextArray);
sampleBuffer.position(0);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(2, GL10.GL_FLOAT, 0, sampleBuffer);
gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, nCount * 2);
gl.glLineWidth(1);
}
Какую дугу вы пытаетесь нарисовать, используя 3 очка? Это круговая дуга или овальная дуга? Или кривая Безье? Что именно? Я вижу, что вы проходите в радиусе; что, кажется, побеждает цель использования 3 очков. –
честно говоря, я не хочу использовать радиус, потому что, если у нас есть начальная точка и центральная точка, мы также можем вычислить радиус. Мы можем игнорировать радиус, но в этой функции, вычисляя точки на окружности, нам нужен радиус, поэтому я использовал это. Мне нужна круговая дуга. Я не знаю, как добиться результата. и я новичок в opengl-es тоже :( –
Часть OpenGL ES по существу не имеет значения, до тех пор, пока вы можете рисовать сегменты линии, вопрос заключается в том, какие сегменты линии рисовать для формирования вашей дуги. Проблема в том, что центр и 2 точки не образуют дугу * круговой *. Вам нужно было бы ограничить две точки, чтобы оба были на круге. –