这是问题所在.我有一个大小为1的矩形画布.因此它的坐标系为(0.0 ... 1.0 - x和0.0 ... 1.0 - y).
我也有一些瓷砖.瓷砖也是矩形.它们具有不同的尺寸,并且瓷砖的数量是变量.
我想在矩形画布中堆叠瓷砖,从0.0到1.0(从左到右,从上到下):
1)瓷砖必须适合画布(但尽可能多地填充空间)
2)瓷砖必须按比例缩放(如果它们不合适),每个瓷砖应按比例缩放(它们必须保持相同的比例).
3)想象你手中有这个"瓷砖",然后将它们一个接一个地放入这个画布中
4)它几乎像"TreeMap算法"但是 - 瓷砖的形状必须相同(矩形),我不需要填充画布的所有空间

有没有人可以用任何C语言(C,C++,Java,C#)向我展示算法?
我试过这个.
1)我计算了瓷砖的面积,然后我计算了瓷砖面积的总和(例如:我有两个瓷砖,一个面积为2,其他面积为1,它们的意思是我的总和为3)
2)然后我计算每个瓷砖在"总面积"中的"比例"(例如:2/3和1/3)
3)然后通过Math.sqrt(x)计算矩形瓦片的大小(例如:Math.sqrt(2/3))
4)然后逐个绘制瓷砖......
但这总是不起作用.有时我会把瓷砖放在画布外面.*
我试图在C#应用程序中创建相当大的位图(6000x6000,尽管大多数是透明的)并且需要将它们绘制到仅支持绘制矩形的特定输出API.
现在,我想知道是否有人有算法将位图缩减为一系列类似颜色的位图的填充矩形; 因为将所有内容绘制为1x1矩形对于此目的来说太慢了.例如,圆应该缩小为一个大的中心矩形,而圆的其余部分则缩小为有效的矩形.该算法甚至不需要那么快,因为我的单像素方法花费的大部分时间是通过循环遍历API本身的每个矩形.
我有一组N个正数,以及一个尺寸为X和Y的矩形,我需要将其划分为N个较小的矩形,这样:
我需要这方面的指示.你知道网上描述的这种算法吗?你有什么想法(伪代码很好)?
谢谢.
我想将我的游戏网格划分为一个矩形阵列.每个矩形为40x40,每列有14个矩形,总共25列.这涵盖了560x1000的游戏区域.
这是我设置的代码,用于在游戏网格上创建第一列矩形:
Rectangle[] gameTiles = new Rectangle[15];
for (int i = 0; i <= 15; i++)
{
gameTiles[i] = new Rectangle(0, i * 40, 40, 40);
}
Run Code Online (Sandbox Code Playgroud)
我很确定这是有效的,但当然我无法确认它,因为矩形不会在屏幕上呈现让我亲眼看到它们.我想为调试目的做的是渲染边框,或用颜色填充矩形,这样我就可以在游戏本身上看到它,只是为了确保它有效.
有没有办法让这种情况发生?或者任何相对简单的方法我可以确保这个有效吗?
非常感谢你.
我有一种切割问题.有一个不规则的多边形,没有任何孔和标准尺寸的矩形瓷砖及其值的列表.
我想要一个有效的算法来找到适合这个多边形的单个最佳值瓦片; 或者只是说单个图块是否适合多边形内部的算法.对于小于100个顶点的不规则多边形,它应该在确定的时间内运行.
请考虑您可以旋转多边形和瓷砖.凸起和非凸多边形的答案/提示是值得赞赏的.
根据我的经验和Oracle Java API文档,我知道他们这样做了,但我想知道为什么.通过构造函数,我只允许将int类型参数传递给Rectangle类,x,y等的内部数据表示属于类型int,并且setSize()只排除类型的参数int.但是,为什么像所有的方法getX(),getY(),getWidth()等返回双时不能有任何的精度?为什么不像int预期的那样简单?
编辑:我确实理解它是从Rectangle2D类派生的,但是仍然没有理由只是不提供任何int基础getX()和getY()函数,因为与Point和Point2D类不同,这些方法不是抽象的.另外setLocation()是不是抽象的要么.
我有一个图像,我在图像上放置一个矩形.然后我旋转图像.如何在旋转的图像上获得矩形的中心?
或者我可以以某种方式旋转矩形以放置旋转图像?我认为在这种情况下,旋转必须沿着与用于旋转图像的点相同的点进行.
这是放置在其上的矩形的图像.

这是旋转的图像.

这是我用来旋转图像的代码:
cv::Mat frame, frameRotated;
frame = cv::imread("lena.png");
cv::Rect rect(225,250,150,150);
cv::rectangle(frame, rect, cv::Scalar(0,0,255),2);
int theta = 30;
double radians = theta * PI / 180.0;
double sin = abs(std::sin(radians));
double cos = abs(std::cos(radians));
int newWidth = (int) (frame.cols * cos + frame.rows * sin);
int newHeight = (int) (frame.cols * sin + frame.rows * cos);
cv::Mat targetMat(cv::Size(newWidth, newHeight), frame.type());
int offsetX = (newWidth - frame.cols) / 2;
int offsetY = (newHeight - frame.rows) / 2;
frame.copyTo(targetMat.rowRange(offsetY, offsetY …Run Code Online (Sandbox Code Playgroud) 我正在研究一个简单的2D游戏,包括Java,swing和没有框架.我有一个矩形播放器,用户可以四处移动.在地图上是玩家不应该经历的几个障碍.我通过为玩家制作一个新的矩形对象以及每个障碍物来实现这一点.但我不确定这是否是正确的方法.它有效,但玩家的动作并不是真正的用户友好.如果玩家想要通过两个障碍物,他们必须在完美的坐标上通过.
用Rectangle对象检查玩家和障碍物之间的交叉点是否是一个好主意,还是应该以另一种方式进行?
现在我的第二个问题:
我想用相同的hitbox替换矩形的hitbox,但是有圆角,这样玩家可以更轻松地通过.
这是游戏在启用了hitbox的情况下的样子.
检查玩家和障碍物是否相交的代码:
for (Player p : this.getPlayerArray()) {
Rectangle recPlayer = p.playerBounds();
for (Obstacle kiste : obstacleArray) {
Rectangle recKiste = kiste.obstBounds();
if (recPlayer.intersects(recKiste)) {
p.setX(100); //Not actual code here
}
}
}
Run Code Online (Sandbox Code Playgroud)
返回播放器/障碍物的hitbox的功能:
public Rectangle obstBounds() {
return new Rectangle(this.getX(),
this.getY(), image.getImage().getWidth(null),
image.getImage().getHeight(null));
}
Run Code Online (Sandbox Code Playgroud) 我有代码接收服务器端之前已定义的特定区域,并在客户端的Form上创建一个漏洞.而不是这个,我想得到这个相同区域的屏幕截图,但没有在最终结果中显示我的表格,就像正常的桌面捕捉,但在这种情况下将只捕获,这个小区域.
那么,我如何调整下面的代码呢?
procedure TForm1.CS1Read(Sender: TObject; Socket: TCustomWinSocket);
var
X1, X2, Y1, Y2: Integer;
List: TStrings;
FormRegion, HoleRegion: HRGN;
StrCommand: String;
begin
StrCommand := Socket.ReceiveText;
if Pos('§', StrCommand) > 0 then
begin
List := TStringList.Create;
try
FormRegion := CreateRectRgn(0, 0, Form12.Width, Form12.Height);
ExtractStrings(['§'], [], PChar(StrCommand), List);
X1 := StrToIntDef(List[0], 0) - Form12.Left - 2;
Y1 := StrToIntDef(List[1], 0) - Form12.Top - 2;
X2 := StrToIntDef(List[2], 0) - Form12.Left - 2;
Y2 := StrToIntDef(List[3], 0) - Form12.Top - 2;
HoleRegion := CreateRectRgn(X1, …Run Code Online (Sandbox Code Playgroud) 如何获得多个重叠矩形的边界框?如果有不重叠的矩形,则可能有多个边界框。
我有一个包含表示矩形的n 个对象的数组。每个对象以下列方式表示一个矩形:{left: 178, top: 67, width: 20, height: 14}它们也可以用其他方式表示,如leftX, topY, rightX, bottomY;它可以很容易地转换。
我不是在寻找非最大抑制算法。文献中是否有特定的算法可以实现这一点?我会尝试在 JavaScript 中转换它。
编辑:只要矩形一个接一个重叠,AuxTaco 解决方案就可以工作;如果按照下图所示的顺序绘制矩形,则会得到 3 个边界区域。
矩形 1 和 2 重叠并且它们的边界框与矩形 3 重叠;但是我对这种特殊情况不感兴趣,可以将 3 视为单独的矩形。
rectangles ×10
algorithm ×4
c# ×2
java ×2
bitmap ×1
bounding-box ×1
delphi ×1
grid ×1
intersection ×1
javascript ×1
opencv ×1
polygon ×1
rotation ×1
screenshot ×1
swing ×1
tiles ×1
xna ×1