Проверьте, находится ли точка в повернутом прямоугольнике (C#)

var string = ['a','a','b','c','c','c','c','c','a','a','a'];

function stringCompress(string){

var obj = {},str = "";
string.forEach(function(i) { 
  obj[i] = (obj[i]||0) + 1;
});

for(var key in obj){
  str += (key+obj[key]);
}
  console.log(obj);
  console.log(str);
}stringCompress(string)

/*
Always open to improvement ,please share 
*/

16
задан Ove 6 August 2009 в 18:41
поделиться

5 ответов

Можно ли применить тот же поворот, примененный к прямоугольнику к точке в обратном направлении?

Например, прямоугольник A повернут на 45 градусов по часовой стрелке от его исходной точки (верхнего левого угла), затем вы просто поверните точку B вокруг того же начала на 45 градусов COUNTER по часовой стрелке, а затем проверьте, попадает ли она в пределы предварительного поворота прямоугольника A

22
ответ дан 30 November 2019 в 16:58
поделиться

См. Края прямоугольника как список векторов, связывающих угол со следующим, сортируя углы по часовой стрелке. Если точка находится в квадрате, она должна быть справа по отношению ко всем векторам ребер.

Это может быть решено с помощью векторных произведений, но сводится к следующему:

Итерация по углам прямоугольника:

  • проверяемая точка - P=[px,py]
  • текущий угол равен C=[cx,cy], а следующий угол равен N=[nx,ny]
  • , если px*ny+cx*py+nx*cy<py*nx+cy*px+ny*cx, точка находится за пределами квадрата.

это на самом деле будет работать для каждого выпуклого многоугольника.

1
ответ дан 30 November 2019 в 16:58
поделиться
  1. Установить PAR :: Packer . Пример для * nix:

     sudo cpan -i PAR :: Packer 

    Для Strawberry Perl для Windows или для установленных ActivePerl и MSVC:

     cpan -i PAR :: Packer 
  2. Упакуйте его с стр . Он создаст исполняемый файл с именем «example» или «example.exe» в Windows.

     pp -o example example.pl 

Это будет работать только в той ОС, в которой он был собран.

PS Это действительно трудно найти клон Unix без Perl. Если да, хотите вы, чтобы все прямоугольники были в одной точке или только один в верхнем слое?

1
ответ дан 30 November 2019 в 16:58
поделиться

Я знаю, что на это уже был дан ответ, но мне пришлось сделать нечто подобное некоторое время назад. Я создал метод расширения для класса System.Windows.Point, который помог сделать именно то, что предложил Нил:

    public static double GetAngle(this Point pt)
    {
        return Math.Atan2(pt.X, -pt.Y) * 180 / Math.PI;
    }

    public static Point SetAngle(this Point pt, double angle)
    {
        var rads = angle * (Math.PI / 180);
        var dist = Math.Sqrt(pt.X * pt.X + pt.Y * pt.Y);
        pt.X = Math.Sin(rads) * dist;
        pt.Y = -(Math.Cos(rads) * dist);
        return pt;
    }

Это позволило бы мне работать с углами точек около 0, 0. Итак, если вы знаете центр прямоугольника, который вы тестируете, вы бы смещали точку отрицательным значением этого значения (например: pt.X - = 32; pt.Y - = 32), а затем вы применили бы отрицательный поворот прямоугольника (как предложил Нил: pt .SetAngle (-45);) ...

Теперь, если точка находится в пределах 64, 64, вы знаете, что попали в прямоугольник. В частности, я проверял пиксель повернутого изображения, чтобы убедиться, что я попал в пиксель определенного цвета.

2
ответ дан 30 November 2019 в 16:58
поделиться

Вы можете сохранить второе неотображаемое изображение, на котором вы рисуете дубликаты прямоугольников, каждый из которых имеет уникальный цвет. Когда пользователь щелкает по окну с картинками, найдите цвет соответствующего пикселя на втором изображении, который будет определять, какой прямоугольник был нажат.

5
ответ дан 30 November 2019 в 16:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: