java怎么让一个数排成矩形_java – 将矩形的四个点重新排序到正确的顺序

回答

如果你知道这是一个非常简单的解决方案:

> -45 < roundedRect.angle< 45

> roundedRect.size.height> roundedRect.size.width

如果是这样,那么顺时针顺序的点总是按照这个顺序:

pts[0], pts[3], pts[2], pts[1]

除此之外,如果它不会对您的程序造成太大的损害,那么这些点将以逆时针的顺序递送,从左上角开始,那么您就不必进行任何重新排序/排序.

其他情况:

> height>宽度&& 135℃, roundedRect.angle< 225 >从左上角开始的顺时针顺序为2,3,0,1

>左上角的逆时针顺序为2,1,0,3.

> width>高度&& -135< roundedRect.angle< -45 >从左上角开始顺时针顺序为3,2,1,0

>左上角的逆时针顺序为3,0,1,2

> width>高度&& 45 < roundedRect.angle< 135 >从左上角开始的顺时针顺序为1,0,3,2

>左上角的逆时针顺序为1,2,3,0

其余的情况都意味着矩形从左到右比从上到下更大,这在你的情景中不会发生.此外,如果角度在这些范围之外,您可以连续添加或减去360度,以获得这些范围之一的角度.

说明

(TL; DR)

我们知道OpenCV如何计算这些点的值.你可以通过一些实验来弄清楚这一点.这是一个我写的一个程序,演示:

import java.awt.BorderLayout;

import java.awt.Dimension;

import java.awt.EventQueue;

import java.awt.Graphics;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JComponent;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.Timer;

import org.opencv.core.Point;

import org.opencv.core.RotatedRect;

import org.opencv.core.Size;

public class TestFrame extends JFrame {

public static void main(String... args) {

final TestFrame frame = new TestFrame();

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

frame.setVisible(true);

}

});

}

private RectComponent rect;

public TestFrame() {

JPanel containerPane = new JPanel(new BorderLayout());

setDefaultCloseOperation(EXIT_ON_CLOSE);

rect = new RectComponent();

containerPane.add(rect);

setContentPane(containerPane);

setSize(400,400);

new Timer(100, rect).start();

}

public class RectComponent extends JComponent implements ActionListener {

private RotatedRect rect = new RotatedRect(new Point(0,0), new Size(1, 3), 0);

private final Point[] pts = new Point[4];

@Override

protected void paintComponent(Graphics g) {

rect.points(pts);

printPoints();

Dimension size = getSize();

drawRectLine(g, pts[0], pts[1], size);

drawRectLine(g, pts[1], pts[2], size);

drawRectLine(g, pts[2], pts[3], size);

drawRectLine(g, pts[0], pts[3], size);

}

private void printPoints() {

System.out.format("A: %d, TL: %s, TR: %s, BR: %s, BL%s%n",

(int) (rect.angle + (rect.angle < 0 ? -1e-6 : 1e-6)), // Stupid doubles, stupid rounding error

pointToString(pts[0]),

pointToString(pts[3]),

pointToString(pts[2]),

pointToString(pts[1]));

}

private String pointToString(Point p) {

return String.format("{%.2f,%.2f}",p.x, p.y);

}

private void drawRectLine(Graphics g, Point left, Point right, Dimension size) {

g.drawLine(scale(left.x, size.width), scale(left.y, size.height),

scale(right.x, size.width), scale(right.y, size.height));

}

private int scale(double value, int coord) {

return (int) (value * coord) / 4 + coord / 2;

}

@Override

public void actionPerformed(ActionEvent e) {

rect.angle += 1;

if(rect.angle > 44) rect.angle = -44;

repaint();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值