Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Java将多边形拉伸到其他多边形

我的问题是,我有一个带有小透视图的矩形,我想将其向后拉伸,以再次显示为矩形。

为了直观地表示它,我目前在我的图像中有类似红色形状的东西,我有4个Points (这个形状的每个角)。因此,我希望拥有类似于蓝色形状的东西,并且我已经有了它的Rectangle对象。

我想知道是否有一种方法可以复制一个多边形,并将其绘制为另一个拉伸的多边形。我找到了适用于Android (setPolyToPoly)的东西,但我找不到适用于java的类似这样的东西。

有没有一些参考或代码样本来执行这个操作,或者可能有一些想法可以解决这个问题?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-28 16:49:27

我想我知道你需要什么:一种可以应用于图像的所谓透视变换。Java有内置的AffineTransform,但是仿射转换总是保留行的“并行度”,所以您不能使用它。

现在,如果你在网络上搜索"java透视图转换“,你会发现很多选项,比如JavaFX PerspectiveTransform,JAI PerspectiveTransform。如果您只需要拉伸图像,您也可以使用JHLabs PerspectiveFilter,还有其他选项。

票数 3
EN

Stack Overflow用户

发布于 2013-05-25 18:11:20

下面是一些代码,可以将一个有四个点的多边形拉伸成一个矩形。

代码语言:javascript
运行
AI代码解释
复制
public static Rectangle2D polyToRect(Polygon polygon) {
    if (polygon.xpoints.length != 4 || polygon.ypoints.length != 4)
        throw new IllegalArgumentException(
                "More than four points, this cannot be fitted to a rectangle");


    Rectangle2D rect = new Rectangle2D.Double();
    for (int i = 0; i < 4; i++) {
        Point2D point = new Point2D.Double(polygon.xpoints[i],
                polygon.ypoints[i]);
        rect.add(point);
    }
    return rect;
}

public static Polygon rectangleToPolygon(Rectangle2D rect) {
    Polygon poly = new Polygon();
    poly.addPoint((int) rect.getX(), (int) rect.getY());
    poly.addPoint((int) (rect.getX() + rect.getWidth()), (int) rect.getY());
    poly.addPoint((int) (rect.getX() + rect.getWidth()),
            (int) (rect.getY() + rect.getHeight()));
    poly.addPoint((int) rect.getX(), (int) (rect.getY() + rect.getHeight()));
    return poly;
}


public static class drawPolyAndRect extends JPanel {
    Polygon poly = new Polygon();

    public drawPolyAndRect() {
        poly.addPoint(0, 0);
        poly.addPoint(400, 40);
        poly.addPoint(400, 250);
        poly.addPoint(0, 400);

    }

    @Override
    @Transient
    public Dimension getPreferredSize() {
        return new Dimension(1000, 1000);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g.create();
        g2d.setColor(Color.green);
        g2d.fill(poly);
        Composite c = AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
                0.5f);
        g2d.setColor(Color.blue);
        g2d.setComposite(c);
        Rectangle2D polyToRect = polyToRect(poly);
        g2d.fill(polyToRect);

        // displace for drawing
        polyToRect.setFrame(polyToRect.getX() + 100,
                polyToRect.getY() + 100, polyToRect.getWidth(),
                polyToRect.getHeight());

        Polygon polyToRectToPoly = rectangleToPolygon(polyToRect);
        g2d.fill(polyToRectToPoly);

        g2d.dispose();
    }

}

public static void main(String[] args) {
    JFrame frame = new JFrame("Poly to rect");
    frame.getContentPane().add(new drawPolyAndRect());
    frame.pack();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}

本质上,这使用了将点添加到空rectangle2d的工作方式,它构建了包含所有四个点的最小矩形,拉伸了多边形。如果希望将返回的矩形作为多边形,请选中第二个静态方法。图片:

票数 1
EN

Stack Overflow用户

发布于 2013-05-28 22:42:35

根据@lbalazscs answer的建议,使用PerspectiveTransform的基于JavaFX的解决方案。

  • Toggle Perspective在content.
  • Morph Perspective上打开和关闭透视效果,平滑地在透视转换和非透视转换内容之间进行动画转换。

代码语言:javascript
运行
AI代码解释
复制
import javafx.animation.*;
import javafx.application.*;
import javafx.beans.value.*;
import javafx.geometry.Pos;
import javafx.scene.*;
import javafx.scene.control.ToggleButton;
import javafx.scene.effect.PerspectiveTransform;
import javafx.scene.image.*;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.*;
import javafx.stage.Stage;
import javafx.util.Duration;

public class PerspectiveMovement extends Application {
  // perspective transformed group width and height.
  private final int W = 280;
  private final int H = 96;

  // upper right and lower right co-ordinates of perspective transformed group.
  private final int URY = 35;
  private final int LRY = 65;

  @Override public void start(Stage stage) {
    final PerspectiveTransform perspectiveTransform = createPerspectiveTransform();

    final Group group = new Group();
    group.setCache(true);
    setContent(group);

    final ToggleButton perspectiveToggle = createToggle(
      group, 
      perspectiveTransform
    );

    VBox layout = new VBox(10);
    layout.setAlignment(Pos.CENTER);
    layout.getChildren().setAll(
      perspectiveToggle,
      createMorph(perspectiveToggle, group, perspectiveTransform),
      group
    );
    layout.setStyle("-fx-padding: 10px; -fx-background-color: rgb(17, 20, 25);");

    stage.setScene(new Scene(layout));
    stage.show();
  }

  private void setContent(Group group) {
    Rectangle rect = new Rectangle(0, 5, W, 80);
    rect.setFill(Color.web("0x3b596d"));

    Text text = new Text();
    text.setX(4.0);
    text.setY(60.0);
    text.setText("A long time ago");
    text.setFill(Color.ALICEBLUE);
    text.setFont(Font.font(null, FontWeight.BOLD, 36));

    Image image = new Image(
      "http://icons.iconarchive.com/icons/danrabbit/elementary/96/Star-icon.png"
    );
    ImageView imageView = new ImageView(image);
    imageView.setX(50);

    group.getChildren().addAll(rect, imageView, text);
  }

  private PerspectiveTransform createPerspectiveTransform() {
    PerspectiveTransform perspectiveTransform = new PerspectiveTransform();

    perspectiveTransform.setUlx(0.0);
    perspectiveTransform.setUly(0.0);
    perspectiveTransform.setUrx(W);
    perspectiveTransform.setUry(URY);
    perspectiveTransform.setLrx(W);
    perspectiveTransform.setLry(LRY);
    perspectiveTransform.setLlx(0.0);
    perspectiveTransform.setLly(H);

    return perspectiveTransform;
  }

  private ToggleButton createToggle(final Group group, final PerspectiveTransform perspectiveTransform) {
    final ToggleButton toggle = new ToggleButton("Toggle Perspective");
    toggle.selectedProperty().addListener(new ChangeListener<Boolean>() {
      @Override public void changed(ObservableValue<? extends Boolean> observable, Boolean wasSelected, Boolean selected) {
        if (selected) {
          perspectiveTransform.setUry(URY);
          perspectiveTransform.setLry(LRY);
          group.setEffect(perspectiveTransform);
        } else {
          group.setEffect(null);
        }
      }
    });

    return toggle;
  }

  private ToggleButton createMorph(final ToggleButton perspectiveToggle, final Group group, final PerspectiveTransform perspectiveTransform) {
    final Timeline distorter = new Timeline(
      new KeyFrame(
        Duration.seconds(0), 
        new KeyValue(perspectiveTransform.uryProperty(), 0,  Interpolator.LINEAR),
        new KeyValue(perspectiveTransform.lryProperty(), H, Interpolator.LINEAR)
      ),
      new KeyFrame(
        Duration.seconds(3), 
        new KeyValue(perspectiveTransform.uryProperty(), URY, Interpolator.LINEAR),
        new KeyValue(perspectiveTransform.lryProperty(), LRY, Interpolator.LINEAR)
      )
    );

    final ToggleButton morphToggle = new ToggleButton("Morph Perspective");
    morphToggle.selectedProperty().addListener(new ChangeListener<Boolean>() {
      @Override public void changed(ObservableValue<? extends Boolean> observable, Boolean wasSelected, Boolean selected) {
        if (!perspectiveToggle.isSelected()) {
          perspectiveToggle.fire();
        }
        if (selected) {
          distorter.setRate(1);
          distorter.play();
        } else {
          distorter.setRate(-1);
          distorter.play();
        }
      }
    });

    return morphToggle;
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16747951

复制
相关文章
边缘计算点燃跨行业的创新革命
从制造业、农业、医疗保健到网络优化、工作场所安全和零售业,边缘计算在各行业领域应用的可能性几乎是无限的。通过减少对云计算平台的依赖,可以加快数据传输,提高敏捷性,降低成本,并支持下一代创新。
静一
2022/12/08
9210
python多行注释和跨行字符串
3》三个单引号(或三个双引号)也可以表示跨行字符串,如: >>> s=''' ... hello ... python ... ''' >>> s '\nhello\npython\n'
py3study
2020/01/07
2.7K0
跨行求职数分的面试经验 + 未来职业规划
这周刚结束一家公司的 3 轮面试,拿到了数据分析岗的 offer。虽然岗位没变,但是在有一年gap year 和跨行求职的前提下拿到的 offer 。
猴子数据分析
2023/09/06
2420
跨行求职数分的面试经验 + 未来职业规划
那些0基础跨行当程序猿的人,是怎样找到工作的?
最近,小N老师收到不少小伙伴的留言,咨询的话题中不少同“转行学开发”有关。 这个话题透露着年底求职的焦虑——对目前的工作薪酬不满意,想从事IT行业的开发工作,又不知道0基础的自己该从何学起。 一方面是工作机会的诱惑,另一方面是技术知识的短板。 正巧,小N老师刚好收到一枚NEXT学院的一位优秀学员的实反馈,聊了一下有关他跨界转行的经历—— 学员:严皇 经历:通过学习NEXT学院课程(前端学位课、小游戏开发课),从电商平面设计师转行做小程序开发 竞争中的机遇 我和NEXT学院的起源,要从一个月黑风高的夜晚
腾讯NEXT学位
2018/12/04
6740
那些0基础跨行当程序猿的人,是怎样找到工作的?
vue+element实现表格跨行或跨列合并
vue+element用于pc后台管理系统比较多,所以后台管理系统一般以处理数据为主,数据结构的复杂程度变高,相对应的前端展示成本也提高, 有些产品经理或许会要求表格跨行或跨列合并,如果你正在想怎么实现,那就接着往下看 最新封装了一个表格合并和编辑插件:vue-split-table,戳一戳 效果图
火狼1
2019/04/17
7.9K0
vue+element实现表格跨行或跨列合并
element-ui中el-table的跨行,合并行计算方式
只有第一列合并行,跨行。合并的规则是纵向相邻的连续N行,如果id一致,则合并。
拿我格子衫来
2022/04/10
2.9K0
element-ui中el-table的跨行,合并行计算方式
element-ui中el-table的跨行,合并行计算方式
看到这个需求一开始我以为很简单,表格跨行.跨列,不就是设置rowspan 和colspan。于是我就把这个功能点放到最后来实现了。
拿我格子衫来
2022/03/28
4.3K0
HTML编程-模板生成含有纵向跨行或横向跨列的表格。
平时我们在开发web网页时,经常遇到把数据呈现为表格报告的情况,有时需要跨列合并或跨行合并单元格来让数据更加直观突出更加条理分明。
MiaoGIS
2021/11/16
2.6K0
HTML编程-模板生成含有纵向跨行或横向跨列的表格。
非科班、跨行业的如何走前端这条路?
近日,由于土哥心血来潮,在知乎上回答了一些前端入门方面的问题,导致很多同学关注了我的公号,以及添加了我的私人微信。
闰土大叔
2019/03/14
7540
数据库事务系列-MySQL跨行事务模型
说来和MySQL倒是有缘,毕业的第一份工作就被分配到了RDS团队,主要负责把MySQL弄到云上做成数据库服务。虽说整天和MySQL打交道,但说实话那段时间并没有很深入的理解MySQL内核,做的事情基本都是围绕着MySQL做管控系统,比较上层。好在周边都是MySQL内核神级人物,在他们的熏陶下多多少少对MySQL的一些基本知识有一些零碎的记录和模糊的认识,这些基础对于今天整理理解MySQL跨行事务模型非常重要。更重要的,有很多不解的地方也可以向大神请教。
Java_老男孩
2019/12/02
1.6K0
数据库事务系列-MySQL跨行事务模型
说来和MySQL倒是有缘,毕业的第一份工作就被分配到了RDS团队,主要负责把MySQL弄到云上做成数据库服务。虽说整天和MySQL打交道,但说实话那段时间并没有很深入的理解MySQL内核,做的事情基本都是围绕着MySQL做管控系统,比较上层。好在周边都是MySQL内核神级人物,在他们的熏陶下多多少少对MySQL的一些基本知识有一些零碎的记录和模糊的认识,这些基础对于今天整理理解MySQL跨行事务模型非常重要。更重要的,有很多不解的地方也可以向大神请教。
星哥玩云
2022/08/18
1.2K0
数据库事务系列-MySQL跨行事务模型
小程序跨行跨列多列复杂表格实现
上面的例子中,最外层一共有4行:基础工资,加班工资,岗位工资,合计。第一层数据的 name 展示为第一列,如果每组数据有 children,取出 children 展示为第二列… 如果 children 长度为0,则直接显示工资数额。
solocoder
2022/04/06
1.9K0
小程序跨行跨列多列复杂表格实现
AI 芯片和传统芯片的区别
比如,自动驾驶需要识别道路行人红绿灯等状况,但是如果是当前的CPU去算,那么估计车翻到河里了还没发现前方是河,这是速度慢,时间就是生命。如果用GPU,的确速度要快得多,但是,功耗大,汽车的电池估计无法长时间支撑正常使用,而且,老黄家的GPU巨贵,经常单块上万,普通消费者也用不起,还经常缺货。另外,GPU因为不是专门针对AI算法开发的ASIC,所以,说到底,速度还没到极限,还有提升空间。而类似智能驾驶这样的领域,必须快!在手机终端,可以自行人脸识别、语音识别等AI应用,这个必须功耗低,所以GPU OUT!
刘盼
2018/12/19
1.6K0
AI 芯片和传统芯片的区别
这是你的芯片!不,这是你的芯片!
清晨6点,沉浸在深深的梦乡里,我追逐着恋人在草地上嬉笑、奔跑、打滚,杠铃般的笑声弥漫了整个梦境......
一斤代码
2018/08/21
5540
这是你的芯片!不,这是你的芯片!
硅光芯片与电芯片的封装
上周中国科协发布了2020重大科学问题和工程技术难题,硅光技术榜上有名,“硅光技术能否促成光电子和微电子的融合?”。这篇笔记聊一聊硅光芯片与电芯片的封装方案。
光学小豆芽
2020/08/27
4.5K0
硅光芯片与电芯片的封装
【HTML】HTML 表格 ③ ( 合并单元格 | 跨行合并 | 跨列合并 | 单元格合并顺序 | 跨行设置 rowspan 属性 | 跨列设置 colspan 属性 )
文章目录 一、合并单元格 1、合并单元格方式 2、合并单元格顺序 3、合并单元格流程 二、合并单元格示例 1、原始表格 2、跨行合并单元格 3、跨列合并单元格 一、合并单元格 ---- 1、合并单元格方式 单元格合并方式 : 跨行合并 : 垂直方向上的 上下 单元格合并 是 跨行合并 , 在 <td> 单元格标签 中 使用 rowspan 属性 , 设置跨行合并单元格数 ; 跨列合并 : 水平方向上的 左右 单元格合并 是 跨列合并 , 在 <td> 单元格标签中 使用 colspan 属性 , 设置
韩曙亮
2023/03/30
9.1K0
【HTML】HTML 表格 ③ ( 合并单元格 | 跨行合并 | 跨列合并 | 单元格合并顺序 | 跨行设置 rowspan 属性 | 跨列设置 colspan 属性 )
【FPGA 芯片设计】FPGA 简介 ( FPGA 芯片架构 | FPGA 芯片相对于传统芯片的优点 )
摩尔定律 : 价格不变 , 在集成电路上 电子元器件的数量 , 18 ~ 24 个月增加一倍 , 同时芯片性能也增加一倍 ;
韩曙亮
2023/03/30
1.9K0
【FPGA 芯片设计】FPGA 简介 ( FPGA 芯片架构 | FPGA 芯片相对于传统芯片的优点 )
✪干货|电信运营商数据价值跨行业运营的现状与思考
作者 | 黄文 一、电信运营商数据资源概况与比较优势 电信运营商作为信息社会的综合信息服务商,拥有天然的数据管道优势,运营商的网络系统与业务平台中数据详细记录了人在现代化社会的信息指纹(如图1)。 图1 电信运营商数据概况 运营商客户的上网和通话行为、位置轨迹等都以BIT的形式流淌在运营商的管道里,而且这些数据是长期积累在运营商的数据管道里的。 因此,电信运营商数据的丰富性、连续性、完整性具有得天独厚的优势,具体来说,运营商数据具有“真、大、快、活、全”五大特点(见图2)。 同时,在跨行业应用领域,
智能算法
2018/04/02
1.9K0
✪干货|电信运营商数据价值跨行业运营的现状与思考
MLP-Like Backbone | Strip-MLP跨行Token交互比SWin Transformer更轻更强的性能
本文首发于 【集智书童】,白名单账号转载请自觉植入本公众号名片并注明来源,非白名单账号请先申请权限,违者必究。
集智书童公众号
2023/09/04
7590
MLP-Like Backbone | Strip-MLP跨行Token交互比SWin Transformer更轻更强的性能
真·富文本编辑器的演进之路-Span开胃菜
https://developer.android.com/guide/topics/text/spans
用户1907613
2021/03/16
2.6K0
真·富文本编辑器的演进之路-Span开胃菜

相似问题

Django测试rest框架: APIRequestFactory与APIClient

12

Django Rest框架APIClient在测试期间不处理异常

31

如何在` `django rest_framework test`的`APIClient`头部添加鉴权token

18

针对查询参数Django REST Framework进行筛选,许多对多

21

Django REST Framework不创建新对象?

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档