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
*/
Можно ли применить тот же поворот, примененный к прямоугольнику к точке в обратном направлении?
Например, прямоугольник A повернут на 45 градусов по часовой стрелке от его исходной точки (верхнего левого угла), затем вы просто поверните точку B вокруг того же начала на 45 градусов COUNTER по часовой стрелке, а затем проверьте, попадает ли она в пределы предварительного поворота прямоугольника A
См. Края прямоугольника как список векторов, связывающих угол со следующим, сортируя углы по часовой стрелке. Если точка находится в квадрате, она должна быть справа по отношению ко всем векторам ребер.
Это может быть решено с помощью векторных произведений, но сводится к следующему:
Итерация по углам прямоугольника:
P=[px,py]
C=[cx,cy]
, а следующий угол равен N=[nx,ny]
px*ny+cx*py+nx*cy<py*nx+cy*px+ny*cx
, точка находится за пределами квадрата. это на самом деле будет работать для каждого выпуклого многоугольника.
Установить PAR :: Packer
. Пример для * nix:
sudo cpan -i PAR :: Packer
Для Strawberry Perl для Windows или для установленных ActivePerl и MSVC:
cpan -i PAR :: Packer
Упакуйте его с стр
. Он создаст исполняемый файл с именем «example» или «example.exe» в Windows.
pp -o example example.pl
Это будет работать только в той ОС, в которой он был собран.
PS Это действительно трудно найти клон Unix без Perl. Если да, хотите вы, чтобы все прямоугольники были в одной точке или только один в верхнем слое?
Я знаю, что на это уже был дан ответ, но мне пришлось сделать нечто подобное некоторое время назад. Я создал метод расширения для класса 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, вы знаете, что попали в прямоугольник. В частности, я проверял пиксель повернутого изображения, чтобы убедиться, что я попал в пиксель определенного цвета.
Вы можете сохранить второе неотображаемое изображение, на котором вы рисуете дубликаты прямоугольников, каждый из которых имеет уникальный цвет. Когда пользователь щелкает по окну с картинками, найдите цвет соответствующего пикселя на втором изображении, который будет определять, какой прямоугольник был нажат.