Как настроить все точки на экране с помощью CImg

Мне нужно рисовать линии с большими двойными значениями, например (3000,00,4500,45).

CImg<unsigned char> img(800,800,1,3,20);
img.draw_line( 3000.00, 4500.45, 3478.567, 4500.45, RED);

Но я хочу, чтобы размер моего экрана был ограничен 800x800.

Думал взять Модуль координат Точки в пределах 800 Нравится

3000.00%800=600

Я могу разместить 600 на моем экране. Но проблема в том, что CPP не поддерживает модуль двойного значения.

double a = 3000.00;
printf("%lf",a%800.0); //Expected 600 but exception
**Invalid operand of type double,double to binary operator%**

Как я могу разместить эти большие точки на моем экране с помощью CImg?


person web2dev    schedule 13.09.2013    source источник
comment
CPP ?? вы должны добавить тег c++   -  person Grijesh Chauhan    schedule 13.09.2013


Ответы (2)


Все зависит от того, что вы хотите выполнить на самом деле:

  • Если вы просто хотите увидеть часть линии, нарисованную на вашем изображении 800x800, то ничего не делайте. Метод CImg<T>::draw_line() реализует отсечение и сделает это автоматически за вас.
  • Если вы хотите рисовать «случайные» линии на экране и не заботитесь о том, что использование модуля в ваших координатах испортит исходный вид линии, вы можете использовать модуль. В вашем случае, вероятно, лучше сначала ввести свои координаты в int, а затем использовать оператор %:

img.draw_line( ((int)x0)%800, ((int)y0)%800, ((int)x1)%800, ((int)y1)%800, RED);

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

person bvalabas    schedule 13.09.2013
comment
Привет Спасибо за ваш ответ. Мне не приходило в голову, что взятие по модулю ничего не даст, а рисует несколько случайных линий. Но я даже не хочу обрезать свои строки. Is it possible to scale those lines smaller so that my screen can hold all the lines ? - person web2dev; 13.09.2013
comment
Я нашел решение, которое может решить мою проблему на данный момент. Пусть я хочу построить точки, которые могут иметь наибольшую координату 9999,99, но мой экран может отображать только точки до 800. Итак, мое решение float scale=9999.99/800; img.draw_line(x0*scale, y0*scale, x1*scale, y1*scale, GREEN); - person web2dev; 13.09.2013
comment
Вот и все, вам нужна глобальная нормализация ваших входных значений. Лучший способ сделать это - сначала найти значения xmin,ymin,xmax,ymax во всех ваших координатах, а затем вычислить новые значения как: X = (x-xmin)*800/(xmax-xmin) и Y = (y-ymin)*800/(ymax-ymin). - person bvalabas; 13.09.2013

Операнд оператора остатка % не может быть двойным (или с плавающей запятой), используйте fmod (double numer, double denom) функция вместо этого.

person Grijesh Chauhan    schedule 13.09.2013