Android 任意多边形以任意条边画平分线切割图形算法

图形学 多边形绘制与平行线填充 相当于用自己的方法实现了一些opengl中函数功能 立即下载

作者:ERIC
日期:2017.1.3


  • 实现需求分析
  • 实现方案解决
  • 代码实现

实现需求分析

转眼就217年了,回想走过的一年,学习到了许多,成长了许多。也弄丢了曾经最珍贵的东西。但是这些都已经过去,今天我们来说说这个算法问题。

对于任意多边形的切割问题,我们可以这样来思考,多边形是有直线组成,所以我们可以看成对直线方程的求解,我们知道初中时学过的直线方程有很多的表现形式,但是一般式是瞒足所有直线的直线方程。所以在我们采用一般式来解决问题。

  • 一般式Ax+By+c=0
  • 斜截式 Kx+c=0

这里写图片描述

如图所示,我们只要知道ABCDE每个点在屏幕坐标系中的坐标就可以求出每天直线的直线方程,例如AB直线:设A(X1,Y1),B(X2,Y2);
A=Y2-Y1;
B=X1-X2;
C=Y1X2-Y2X1;

代码如下

 /**
     * 计算线段的直线方程
     *
     * @param landPoint1
     * @param landPoint2
     * @return
     */
    public static LineSlope calculateSignleSlope(LandPoint landPoint1, LandPoint landPoint2) {
        double A = landPoint2.getyPoint() - landPoint1.getyPoint();
        double B = landPoint1.getxPoint() - landPoint2.getxPoint();
        double C = landPoint1.getyPoint() * landPoint2.getxPoint() - landPoint1.getxPoint() * landPoint2.getyPoint();
        System.out.println("A=" + A + "B=" + B + "C==" + C);
        return new LineSlope(A, B, C, landPoint1, landPoint2);
    }

这里我们只需写一个循环将所有直线的abc都求出来。
然后我么指定一条边作为参考边,可以将所有距离这条直线d的直线方程求解出来,然后求出平行线线与其他两条边的焦点,在求解焦点之前我们我们知道,与一条平行线距离为d的直线方程有两条,那么我们求出的焦点就会有4个,两个在多边形外,两个在多边形里面。所以我们需要知道正确的平行线方程。
求解代码如下:

/**
     * 获取平行线移动分割方向
     *
     * @param xielv0
     * @param xielv1
     * @param xielv2
     * @param distance
     * @return
     */
    public static int getDirection(LineSlope xielv0, LineSlope xielv1, LineSlope xielv2, double distance) {
        BigDecimal A = new BigDecimal(xielv1.getA()).multiply(new BigDecimal(xielv1.getA()));
        BigDecimal B = new BigDecimal(xielv1.getB()).multiply(new BigDecimal(xielv1.getB()));
        BigDecimal add = A.add(B);
        double c = new BigDecimal(xielv1.getC()).add(new BigDecimal(distance).multiply(new BigDecimal(1)).multiply(new BigDecimal(StrictMath.sqrt(add.doubleValue())))).doubleValue();
        double xPoint = (new BigDecimal(xielv2.getC()).multiply(new BigDecimal(xielv1.getB())).subtract(new BigDecimal(c).multiply(new BigDecimal(xielv2.getB()))))
                .divide((new BigDecimal(xielv1.getA()).multiply(new BigDecimal(xielv2.getB())).subtract(new BigDecimal(xielv1.getB()).multiply(new BigDecimal(xielv2.getA())))), 20, BigDecimal.ROUND_HALF_DOWN).doubleValue();
        double yPoint = (new BigDecimal(xielv1.getA()).multiply(new BigDecimal(xielv2.getC())).subtract(new BigDecimal(c).multiply(new BigDecimal(xielv2.getA()))))
                .divide((new BigDecimal(xielv1.getB()).multiply(new BigDecimal(xielv2.getA())).subtract(new BigDecimal(xielv1.getA()).multiply(new BigDecimal(xielv2.getB())))), 20, BigDecimal.ROUND_HALF_DOWN).doubleValue();
        LandPoint landPoint = new LandPoint(xPoint, yPoint);
        double a = xielv2.getPoint1().getxPoint() > xielv2.getPoint2().getxPoint() ? xielv2.getPoint1().getxPoint() : xielv2.getPoint2().getxPoint();
        double a1 = xielv2.getPoint1().getxPoint() < xielv2.getPoint2().getxPoint() ? xielv2.getPoint1().getxPoint() : xielv2.getPoint2().getxPoint();
        double b = xielv2.getPoint1().getyPoint() > xielv2.getPoint2().getyPoint() ? xielv2.getPoint1().getyPoint() : xielv2.getPoint2().getyPoint();
        double b1 = xielv2.getPoint1().getyPoint() < xielv2.getPoint2().getyPoint() ? xielv2.getPoint1().getyPoint() : xielv2.getPoint2().getyPoint();
        if (landPoint.getxPoint() <= a && landPoint.getxPoint() >= a1 && landPoint.getyPoint() <= b && landPoint.getyPoint() >= b1) {
            System.out.println(landPoint.getxPoint() + "__Point__" + landPoint.getyPoint());
            return 1;
        } else {
            double c1 = new BigDecimal(xielv1.getC()).add(new BigDecimal(distance).multiply(new BigDecimal(1)).multiply(new BigDecimal(StrictMath.sqrt(new BigDecimal(xielv1.getA()).multiply(new BigDecimal(xielv1.getA())).add(new BigDecimal(xielv1.getB()).multiply(new BigDecimal(xielv1.getB()))).doubleValue())))).doubleValue();
            double xPoint1 = (new BigDecimal(xielv0.getC()).multiply(new BigDecimal(xielv1.getB())).subtract(new BigDecimal(c1).multiply(new BigDecimal(xielv0.getB()))))
                    .divide((new BigDecimal(xielv1.getA()).multiply(new BigDecimal(xielv0.getB())).subtract(new BigDecimal(xielv1.getB()).multiply(new BigDecimal(xielv0.getA())))), 20, BigDecimal.ROUND_HALF_DOWN).doubleValue();
            double yPoint1 = (new BigDecimal(xielv1.getA()).multiply(new BigDecimal(xielv0.getC())).subtract(new BigDecimal(c1).multiply(new BigDecimal(xielv0.getA()))))
                    .divide((new BigDecimal(xielv1.getB()).multiply(new BigDecimal(xielv0.getA())).subtract(new BigDecimal(xielv1.getA()).multiply(new BigDecimal(xielv0.getB())))), 20, BigDecimal.ROUND_HALF_DOWN).doubleValue();
            LandPoint landPoint1 = new LandPoint(xPoint1, yPoint1);
            double a11 = xielv0.getPoint1().getxPoint() > xielv0.getPoint2().getxPoint() ? xielv0.getPoint1().getxPoint() : xielv0.getPoint2().getxPoint();
            double a12 = xielv0.getPoint1().getxPoint() < xielv0.getPoint2().getxPoint() ? xielv0.getPoint1().getxPoint() : xielv0.getPoint2().getxPoint();
            double b11 = xielv0.getPoint1().getyPoint() > xielv0.getPoint2().getyPoint() ? xielv0.getPoint1().getyPoint() : xielv0.getPoint2().getyPoint();
            double b12 = xielv0.getPoint1().getyPoint() < xielv0.getPoint2().getyPoint() ? xielv0.getPoint1().getyPoint() : xielv0.getPoint2().getyPoint();
            if (landPoint1.getxPoint() <= a11 && landPoint1.getxPoint() >= a12 && landPoint1.getyPoint() <= b11 && landPoint1.getyPoint() >= b12) {
                System.out.println(landPoint1.getxPoint() + "__Point__" + landPoint1.getyPoint());
                return 1;
            } else {
                return 0;
            }
        }
    }

现在我们就可以去求解每条平行线与每条边的正确焦点。知道焦点后我们就可以很容易的将两个点连接起来组成一条直线。
求解所有平行线与每条边的焦点代码

 /**
     * 获取所有的平行线端点
     *
     * @param position
     * @param xielvs
     * @param distance
     * @return
     */
    public static ArrayList<LandPointArrayList> getAllLinePoints(int position, ArrayList<LineSlope> xielvs, double distance) {
        ArrayList<LandPointArrayList> landPointArrayLists = new ArrayList<>();
        int direction;
        final double D = xielvs.get(position).getC();
        double C = xielvs.get(position).getC();
        int j = 1;
        boolean isComputeing = true;
        if (position == xielvs.size() - 1) {
            direction = getDirection(xielvs.get(position - 1), xielvs.get(position), xielvs.get(0), distance);
        } else if (position == 0) {
            direction = getDirection(xielvs.get(xielvs.size() - 1), xielvs.get(position), xielvs.get(position + 1), distance);
        } else {
            direction = getDirection(xielvs.get(position - 1), xielvs.get(position), xielvs.get(position + 1), distance);
        }
        LineSlope xielvOld = new LineSlope(xielvs.get(position).getA(), xielvs.get(position).getB(), xielvs.get(position).getC(), xielvs.get(position).getPoint1(), xielvs.get(position).getPoint2());
        xielvs.remove(position);
        while (isComputeing) {
            LandPointArrayList landPointArrayList = new LandPointArrayList();
            switch (direction) {
                case 0:
                    C = new BigDecimal(D).subtract(new BigDecimal(distance).multiply(new BigDecimal(j)).multiply(new BigDecimal(StrictMath.sqrt(new BigDecimal(xielvOld.getA()).multiply(new BigDecimal(xielvOld.getA())).add(new BigDecimal(xielvOld.getB()).multiply(new BigDecimal(xielvOld.getB()))).doubleValue())))).doubleValue();
                    break;
                case 1:
                    C = new BigDecimal(D).add(new BigDecimal(distance).multiply(new BigDecimal(j)).multiply(new BigDecimal(StrictMath.sqrt(new BigDecimal(xielvOld.getA()).multiply(new BigDecimal(xielvOld.getA())).add(new BigDecimal(xielvOld.getB()).multiply(new BigDecimal(xielvOld.getB()))).doubleValue())))).doubleValue();
                    break;
            }
            xielvOld.setC(C);
            for (int i = 0; i < xielvs.size(); i++) {
                double xPoint = (new BigDecimal(xielvs.get(i).getC()).multiply(new BigDecimal(xielvOld.getB())).subtract(new BigDecimal(xielvOld.getC()).multiply(new BigDecimal(xielvs.get(i).getB()))))
                        .divide((new BigDecimal(xielvOld.getA()).multiply(new BigDecimal(xielvs.get(i).getB())).subtract(new BigDecimal(xielvOld.getB()).multiply(new BigDecimal(xielvs.get(i).getA())))), 20, BigDecimal.ROUND_HALF_DOWN).doubleValue();
                double yPoint = (new BigDecimal(xielvOld.getA()).multiply(new BigDecimal(xielvs.get(i).getC())).subtract(new BigDecimal(xielvOld.getC()).multiply(new BigDecimal(xielvs.get(i).getA()))))
                        .divide((new BigDecimal(xielvOld.getB()).multiply(new BigDecimal(xielvs.get(i).getA())).subtract(new BigDecimal(xielvOld.getA()).multiply(new BigDecimal(xielvs.get(i).getB())))), 20, BigDecimal.ROUND_HALF_DOWN).doubleValue();
                LandPoint landPoint = new LandPoint(xPoint, yPoint);
                double a = xielvs.get(i).getPoint1().getxPoint() > xielvs.get(i).getPoint2().getxPoint() ? xielvs.get(i).getPoint1().getxPoint() : xielvs.get(i).getPoint2().getxPoint();
                double a1 = xielvs.get(i).getPoint1().getxPoint() < xielvs.get(i).getPoint2().getxPoint() ? xielvs.get(i).getPoint1().getxPoint() : xielvs.get(i).getPoint2().getxPoint();
                double b = xielvs.get(i).getPoint1().getyPoint() > xielvs.get(i).getPoint2().getyPoint() ? xielvs.get(i).getPoint1().getyPoint() : xielvs.get(i).getPoint2().getyPoint();
                double b1 = xielvs.get(i).getPoint1().getyPoint() < xielvs.get(i).getPoint2().getyPoint() ? xielvs.get(i).getPoint1().getyPoint() : xielvs.get(i).getPoint2().getyPoint();
                if (landPoint.getxPoint() <= a && landPoint.getxPoint() >= a1 && landPoint.getyPoint() <= b && landPoint.getyPoint() >= b1) {
                    System.out.println(landPoint.getxPoint() + "__Point__" + landPoint.getyPoint());
                    if (landPointArrayList.getLandPointStart() == null) {
                        landPointArrayList.setLandPointStart(landPoint);
                    } else {
                        landPointArrayList.setLandPointEnd(landPoint);
                    }

                }

            }
            if (landPointArrayList.getLandPointStart() == null || landPointArrayList.getLandPointEnd() == null) {
                isComputeing = false;
            } else {
                landPointArrayLists.add(landPointArrayList);
            }
            j = j + 1;
        }
        return landPointArrayLists;
    }

最后以每条平行线的中点计算箭头直线,由于需求是每相邻的两条平行线方向相反。

   /**
     * @param landPointArrayLists 平行线的两个端点
     * @param lineLong            箭头长度
     * @return 箭头点
     */
    public ArrayList<ArrowPoint> getArrow(ArrayList<LandPointArrayList> landPointArrayLists, int lineLong) {
        double number = StrictMath.sqrt(3);
        ArrayList<ArrowPoint> arrowList = new ArrayList();
        boolean right = true;
        for (LandPointArrayList landPointArrayList : landPointArrayLists) {
            double centerPointLineX = (new BigDecimal(landPointArrayList.getLandPointStart().getxPoint()).add(new BigDecimal(landPointArrayList.getLandPointEnd().getxPoint()))).divide(new BigDecimal("2")).doubleValue();
            double centerPointLineY = (new BigDecimal(landPointArrayList.getLandPointStart().getyPoint()).add(new BigDecimal(landPointArrayList.getLandPointEnd().getyPoint()))).divide(new BigDecimal("2")).doubleValue();
            double A = landPointArrayList.getLandPointEnd().getyPoint() - landPointArrayList.getLandPointStart().getyPoint();
            double B = landPointArrayList.getLandPointStart().getxPoint() - landPointArrayList.getLandPointEnd().getxPoint();
            double C = landPointArrayList.getLandPointStart().getyPoint() * landPointArrayList.getLandPointEnd().getxPoint() - landPointArrayList.getLandPointStart().getxPoint() * landPointArrayList.getLandPointEnd().getyPoint();
            double v = Math.atan(-new BigDecimal(A).divide(new BigDecimal(B), 20, BigDecimal.ROUND_HALF_DOWN).doubleValue()) * 180 / Math.PI;
            double K = Math.tan((v + 30) * Math.PI / 180);
            double cnum = new BigDecimal(centerPointLineY).subtract(new BigDecimal(centerPointLineX).multiply(new BigDecimal(K))).doubleValue();
            BigDecimal add = new BigDecimal("1").add(new BigDecimal(K).multiply(new BigDecimal(K)));
            BigDecimal bigDecimal = new BigDecimal(StrictMath.sqrt(add.doubleValue()));
            double arrowX1 = new BigDecimal(centerPointLineX).subtract(new BigDecimal(lineLong).divide(bigDecimal, 20, BigDecimal.ROUND_HALF_DOWN)).doubleValue();
            double arrowX2 = new BigDecimal(centerPointLineX).add(new BigDecimal(lineLong).divide(new BigDecimal(StrictMath.sqrt(new BigDecimal("1").add(new BigDecimal(K).multiply(new BigDecimal(K))).doubleValue())), 20, BigDecimal.ROUND_HALF_DOWN)).doubleValue();
            double arrowY1 = new BigDecimal(K).multiply(new BigDecimal(arrowX1)).add(new BigDecimal(cnum)).doubleValue();
            double arrowY2 = new BigDecimal(K).multiply(new BigDecimal(arrowX2)).add(new BigDecimal(cnum)).doubleValue();

            double K2 = Math.tan((v - 30) * Math.PI / 180);
            double cnum2 = new BigDecimal(centerPointLineY).subtract(new BigDecimal(centerPointLineX).multiply(new BigDecimal(K2))).doubleValue();
            double arrowX21 = new BigDecimal(centerPointLineX).subtract(new BigDecimal(lineLong).divide(new BigDecimal(StrictMath.sqrt(new BigDecimal("1").add(new BigDecimal(K2).multiply(new BigDecimal(K2))).doubleValue())), 20, BigDecimal.ROUND_HALF_DOWN)).doubleValue();
            double arrowX22 = new BigDecimal(centerPointLineX).add(new BigDecimal(lineLong).divide(new BigDecimal(StrictMath.sqrt(new BigDecimal("1").add(new BigDecimal(K2).multiply(new BigDecimal(K2))).doubleValue())), 20, BigDecimal.ROUND_HALF_DOWN)).doubleValue();
            double arrowY21 = new BigDecimal(K2).multiply(new BigDecimal(arrowX21)).add(new BigDecimal(cnum2)).doubleValue();
            double arrowY22 = new BigDecimal(K2).multiply(new BigDecimal(arrowX22)).add(new BigDecimal(cnum2)).doubleValue();


            Log.e("aaaaa", "cnum" + cnum + "cnum2" + cnum2 + "---" + "arrowX1" + arrowX1 + "arrowY1" + arrowY1 + "---" + "arrowX2" + arrowX2 + "arrowY2" + arrowY2 + "---" + "arrowX21" + arrowX21 + "arrowY21" + arrowY21 + "---" + "arrowX22" + arrowX22 + "arrowY22" + arrowY22);
            double maxX1 = Math.max(arrowX1, arrowX2);
            double maxX2 = Math.max(arrowX21, arrowX22);
            double maxY1 = new BigDecimal(K).multiply(new BigDecimal(maxX1)).add(new BigDecimal(cnum)).doubleValue();
            double maxY2 = new BigDecimal(K2).multiply(new BigDecimal(maxX2)).add(new BigDecimal(cnum2)).doubleValue();

            double minX1 = Math.min(arrowX1, arrowX2);
            double minX2 = Math.min(arrowX21, arrowX22);
            double minY1 = new BigDecimal(K).multiply(new BigDecimal(minX1)).add(new BigDecimal(cnum)).doubleValue();
            double minY2 = new BigDecimal(K2).multiply(new BigDecimal(minX2)).add(new BigDecimal(cnum2)).doubleValue();
            LandPoint startPoint;
            LandPoint endPoint;
            LandPoint maxEndPoint;
            LandPoint maxStartPoint;
            LandPoint minStartPoint;
            LandPoint minEndPoint;

            double divide = new BigDecimal(-A).divide(new BigDecimal(B), 20, BigDecimal.ROUND_HALF_DOWN).doubleValue();

            double maxY3 = Math.max(arrowY1, arrowY2);
            double maxY4 = Math.max(arrowY21, arrowY22);

            if (arrowY1 > arrowY2) {
                maxStartPoint = new LandPoint(arrowX1, arrowY1);
                minStartPoint = new LandPoint(arrowX2, arrowY2);
            } else {
                maxStartPoint = new LandPoint(arrowX2, arrowY2);
                minStartPoint = new LandPoint(arrowX1, arrowY1);
            }

            if (arrowY21 > arrowY22) {
                maxEndPoint = new LandPoint(arrowX21, arrowY21);
                minEndPoint = new LandPoint(arrowX22, arrowY22);
            } else {
                maxEndPoint = new LandPoint(arrowX22, arrowY22);
                minEndPoint = new LandPoint(arrowX21, arrowY21);
            }

            if (divide < -number || divide > number) {
                if (right) {
                    startPoint = maxStartPoint;
                    endPoint = maxEndPoint;
                    right = false;
                } else {
                    startPoint = minStartPoint;
                    endPoint = minEndPoint;
                    right = true;
                }
            } else {
                if (right) {
                    startPoint = new LandPoint(maxX1, maxY1);
                    endPoint = new LandPoint(maxX2, maxY2);
                    right = false;
                } else {
                    startPoint = new LandPoint(minX1, minY1);
                    endPoint = new LandPoint(minX2, minY2);
                    right = true;
                }

            }
            arrowList.add(new ArrowPoint(startPoint, new LandPoint(centerPointLineX, centerPointLineY), endPoint));


        }
        return arrowList;
    }

只要求出这些点就可以轻松使用Android Paint画出来。
这里写图片描述

平行四边形的效果实现 使用ShapeDrawable、shape和canvas实现平行四边形的效果 立即下载

相关推荐

多边形切割算法

与多边形有的一些算法,比如计算面积可以用切割法等

C++ 平行线分割平面题解

C++ 平行线分割平面题解

2302_79410303的博客 913

Android 以任意比例裁剪图片代码分享

主要介绍了Android 以任意比例裁剪图片的相关资料,非货不错,具有参考借鉴价值,需要的朋友可以参考下

计算机图形学----直线与多边形的裁剪

计算机图形学----直线与多边形的裁剪        裁剪算法详解:在使用计算机处理图形信息时,计算机内部存储的图形往往比较大,而屏幕显示的只是图的一部分。因此需要确定图形中哪些部分落在显示区之内,哪些落在显示区之外,以便只显示落在显示区内的那部分图形。这个选择过程称为裁剪。最简单的裁剪方法是把各种图形扫描转换为点之后,再判断各点是否在窗内。但那样太费时,一般不可取。这是因为有些图形组成部分全部

ljheee的博客 1万+

【LaTeX】IEEE会议模板中使用BibTex插入文献(解决报错:Something‘s wrong--perhaps a missing \item. \end{thebibliography}

使用IEEE会议论文LaTeX模板时遇到的一个错误,问题描述为:使用Texstudio编译LaTeX模板报错,报错信息提示为。出现的原因为IEEE会议论文模板自带的参考文献引用方式为手动插入,即不使用格式的参考文献,手动将参考文献调整为合适格式,然后粘贴到文本中,我准备将其换成方法引用参考文献。我的替换步骤为删除原始参考文献对应内容,即模板中的: 将以下函数添加到原始参考文献对应位置,对应上文新建的文件。 再次编译出现报错 删除文件夹中的文件 修改模板中的引用名称 引用方法为: 将 替换为 再次编译——

TangPlusHPC的博客 9907

AOSP Android14 Launcher3——动画核心类QuickstepTransitionManager详解

是一个复杂但核心的动画管理器。它利用 Android 的远程动画机制,拦截系统默认的窗口切换,并替换为高度定制、与 Launcher UI 深度集成的平滑过渡动画。当用户从一个应用程序通过手势或按键返回到 Launcher (桌面) 时,它负责创建和运行动画,使得应用程序窗口能够平滑地过渡(通常是缩小)到 Launcher 上的对应目标(图标、小部件或屏幕中心),同时 Launcher 界面元素(工作区、背景等)恢复显示。计算动画所需的各种参数,如窗口的起始/结束位置、缩放比例、透明度、圆角、裁剪区域等。

Micheal_Yang's Blog 2667

线段切割多边形算法

大家好,分享一个几何算法思路,欢迎提出更优的方法! 一、问题:用一个线段集切割一个多边形,得到多个切割后的多边形。将其看成以点为节点的图结构,依次搜索最小的闭合区域。 三、算法思路: 1 所有线段求相交,得到所有点,并根据点和点之间的连接关系,得到有向图(双向连接) vector<Point> AllPts;//所有的交点 map<int,vector<int>> Graph;//有向图,key为节点下标,value为和其相连的点 ...

瞬Future 3491

CTP-API开发系列之三:柜台系统简介

综合交易平台(Comprehensive Transaction Platform,CTP)是专门为期货公司开发的一套期货经纪业务管理系统,由交易、风险控制和结算三大系统组成。接下来分享的内容,对于期货公司的负责交易、运维同事会比较熟悉,针对CTP-API接口对接的朋友可以了解一下,在接口之上的系统是怎样的。

码上助君的专栏 6195

线段切割不规则多边形

在项目中有用线段切割多边形的需求。所以在网上找到了一篇比较好的实现。

安牛牛牛的博客 586

MOS 管驱动设计细节,波形分析

一般认为MOSFET是电压驱动的,不需要驱动电流。然而,在MOS的G S两级之间有结电容存在,这个电容会让驱动MOS变的不那么简单。 如果不考虑纹波和EMI等要求的话,MOS管开关速度越快越好,因为开关时间越短,开关损耗越小,而在开关电源中开关损耗占总损耗的很大一部分,因此MOS管驱动电路的好坏直接决定了电源的效率。 对于一个MOS管,如果把GS之间的电压从0拉到管子的开启电压所用的时间越短,那么MOS管开启的速度就会越快。与此类似,如果把MOS管的GS电压从开启电压降到0V的时间越短,那么MOS管关断的

m0_50862404的博客 1万+

如何免费访问和使用Gemini API?

Gemini Ultra具有最先进的性能,在几个指标上超过了GPT-4的性能。它是第一个在大规模多任务语言理解基准测试中超越人类专家的模型,该基准测试57个不同学科的世界知识和解决问题的能力。Gemini是谷歌迄今为止开发的最先进、最庞大的AI模型。它为多模态而建,理解并处理不同类型的数据,比如文本、代码、音频、图像和视频。下面我们将加载Masood Aslami的图像,并用它来测试Gemini Pro Vision的多模态性。有了Gemini可以为查询提供图像、音频和文本,获得几乎完美的答案。

java_cjkl的博客 1万+

Unity 2D 任意多边形切割算法

多边形切割

刘丿建宁 1409

【IxNetwork】史上最全IxNetwork测试仪使用精讲(一),图文教程超赞超详细!!!

IXIA使用的是Server-client模式,Server端在测试仪表的主机上,在开机后会随着主机内的操作系统的启动而自动启动,一般情况下不需要人为的手工启动。因此在通常不需要为主机配置专用的显示器和键盘。client端包括两个测试软件: Ixia Explorer和ScriptMate。这两个软件一般安装在测试用计算机上,在仪表自带的主机中也有这两个软件。根据测试项目的不同来选择使用不同的软件。Ixia Explorer主要提供数据流的测试,针对设备的功能进行测试;

风云说通信 2054

android实现使用绘图作出一种裁剪任意多边形快速算法

在一个重写的View,主要绘制在View的OnDraw()方法中, 首先:先绘制出几个点,当然是任意多 最后一个点和第一个点闭合在一起之后,画点结束 然后可以随意拖动达到裁减的效果 当然裁剪的功能没有实现 代码如下 View--------: --*************************************************************

cafelette的专栏 1236

43、基于机器学习的GNSS信号质量监测方法

本文提出了一种基于支持向量机(SVM)的GNSS信号质量监测方法,旨在有效检测邪恶波形(EWF)威胁并抑制多径干扰对导航精度的影响。通过构建包含现场采集与合成数据的数据集,结合11个相关器测量值、链路预算、仰角和方位角等特征,采用RBF核函数的SVM模型进行分类。研究评估了不同平滑时间窗口对漏检率和误报率的影响,结果表明在约35-40秒平滑时间下性能趋于稳定,并可通过多数投票机制进一步优化检测性能。该方案适用于星载GNSS接收器,在计算资源受限条件下实现了高可靠性与低完整性风险的平衡。

yyy34的博客 188

python凹多边形分割_直线切割凹多边形

一,算法原理以上图为例,直线(start,end)切割凹多边形ABCDEFGHIJKLMNOP。记切割线divLine=(start,end)。多边形顶点序列vertexList=(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P)。边序列edgeList=(AB,BC,CD,DE,EF,FG,GH,HI,IJ,JK,KL,LM,MN,NO,OP,PA)。下面开始计算:1,求切割点。...

weixin_42398508的博客 1336

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

四边形面积等分以及多边形面积等分的讨论

按:目前和软件无关,借此宝地发个日志。 四边形面积等分 百度上面的一个小题目, 没事就想想,喜欢喝点儿小酒而已。 想了几次,想出来了,记录如下 已知:凸多边形ABCD求做一直线将其面积等分 思路:三角形,中线,等底等高三角形等等。 解法:延长DC至E,使EB//于AD,则三角形ABC和AEC面积相等,这样,三角形AED的面积等于四边形ABCD的面积,则三角形AED的中线AF就是满足条件的一个解。...

退休码农的自留地 2938

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

多边形切割

      之前基本上遇到的多边形切割问题都是凸多边形问题,而针对凹多边形的切割问题却很少。偶然发现一个做得特别棒的滑动切割的游戏,游戏中主要是使用多边形切割以及多边形碰撞算法。针对多边形切割的实现做了一下研究,现在把实现跟大家分享一下。      给定任意一个多边形以及一条线段,如果多边形被线段切割,计算切割后产生的多个多边形。实现的算法思想如下:      1、求多边形每一条边跟线段的交点,将...

zengyun_cool_2008的专栏 7621

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Android 图形状态组合的应用 (笔记 )

目的:创建按钮,当按钮使按钮有不同的形状状态     在res下drawable-hdpi保存按钮初始状态left.png和按钮按下后的状态图片rigth.png.          将图片文件拖到创建好的文件夹drawable-hdpi中          创建一个一般的XML文件,新建图形状态组合步骤为     drawable_change → New → Other... →

西西的博客 1328

android多边形图片,android – 按多边形区域裁剪图像

我想通过多边形区域裁剪图像,但无法找到任何可以制作它的库.OpenCV对于这个小东西来说太大了. JJIL [enter link description here]裁剪矩形区域.也许你有任何想法我怎么能实现它?感谢帮助!为Nidhi:尝试这样的东西,如果不起作用 – 为路径创建另一个画布,然后从中获取Bitmap(用于遮罩),并将此遮罩位图应用于初始画布而不是drawPath.Bitmap ob...

weixin_35607076的博客 672

Android番外篇 Glide获取图片Path、Bitmap用法详解

(一)图片下载缓存好之后获取 Glide.with(mContext).load(url).asBitmap().into(new SimpleTarget<Bitmap () { @Override public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap glideAnimation) { image.setImageBitmap(resource

圈池 1495
下一篇: android Imageview 随心所欲定制四个圆角
ERICML
博客等级 码龄11年 7粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值