#c# #integer #double #pixel #mousemove
Вопрос:
Я пытаюсь создать программу, которая перемещает вашу мышь на определенное количество пикселей. Координаты перемещений задаются в целых числах «dx» и «dy» и берутся из массива целых чисел, например { -85, 75 }, { 0, 67 }, { 33, 57 }, { 58, 48 }
и так далее — таких перемещений предостаточно.
Массив этих координат задается для чувствительности мыши = 0,25
Что мне нужно сделать, так это преобразовать его в чувствительность мыши, равную 1
Чтобы получить в 4 раза меньше ходов, я попытался разделить значения (целые числа) Я получаю из массива ( {-85, 75}
) и делю каждый ход на 4.
Вся проблема в том, что, когда я делю, допустим -85 / 4
, у меня остается остаток, А ЭТО ЗНАЧИТ, ЧТО я ТЕРЯЮ ПИКСЕЛИ при каждом движении.
Он может быть сохранен в двойном формате, но движение мыши может быть выражено только в целых, так как мы не можем переместиться на половину пикселя
Есть какое-нибудь решение этой проблемы? Если я потеряю 3 или 4 пикселя на каждом снимке, это не будет иметь большого значения, но, поскольку он накапливается, становится все хуже и хуже.
Вот фрагмент моего кода, который отвечает за перемещение мыши:
`
private void _MoveMouse()
{
while (appRunning)
{
if (Utility.bGetAsyncKeyState(Keys.LButton))
{
int[,] pattern = Current_Table().Item1; //Current_Table() returns table of (x, y) coordinates in integers and sleep time in integer that is used to sleep the thread
int sleep = Current_Table().Item2;
if (_ENABLED == true)
{
for (int i = 0; i < 30; i )
{
int dx = pattern[i, 0]/4; //leaves a remainder from X coordinates that can not be stored in integer.
int dy = pattern[i, 1]/4; //leaves a remainder from Y coordinates that can not be stored in integer
int dx_rest = dx % 4; //the remainder from X
int dy_rest = dy % 4; //the remainder from Y
//MessageBox.Show(Convert.ToString(pattern[i,0] " " pattern[i,1]));
Utility.Move(dx, dy );
Thread.Sleep(sleep);
if (Utility.bGetAsyncKeyState(Keys.LButton)== false)
{
break;
}
}
}`
Комментарии:
1. Позвольте мне попробовать еще раз. Добро пожаловать в целочисленное деление, это боль. Часто решение проблем, с которыми вы сталкиваетесь, связано с выполнением всех вычислений с использованием чисел с плавающей запятой. Таким образом, ошибки не накапливаются. Если вам нужно целое число, преобразуйте свое фактическое число (с плавающей запятой или двойное) в int. Вам, вероятно, следует использовать банкиров круглыми (иначе говоря, круглыми до четных). Таким образом, вы минимизируете ошибку
2. Я думаю, что это больше проблема с методом перемещения мыши, потому что она перемещается на пиксели, поэтому она не может перемещаться на 0,3 пикселя :/
3. Правильно, но если вы отслеживаете все точно (без ошибок) и решите, что вам нужно переместить 0,3 пикселя (так как это округляется до нуля). Тогда ты не двигаешься. Затем, в следующий раз, возможно, вам придется переместить 0,4 пикселя в том же направлении. Когда вы сравниваете, где вы. находясь там, где вы хотите быть, вы понимаете, что разница составляет 0,7. Таким образом, вы перемещаете один пиксель. Вам нужно хранить два набора книг: с плавающей запятой и в целых числах. Сделать все правильно-это боль. Но это можно сделать