拉斐尔 js.沿曲线填充颜色

2024-01-11

我创建了一个圆,可以在其中选择沿圆圆周的两个点。

我想填充这两点之间的部分。

Demo http://jsfiddle.net/jashwant/CDBk6/

如果你看到演示,我想填充两点之间的角度。

JS:

(function (Raphael) {
    Raphael.colorwheel = function (x, y, size, initcolor, element) {
        return new ColorWheel(x, y, size, initcolor, element);
    };
    var pi = Math.PI,
        doc = document,
        win = window,
        ColorWheel = function (x, y, size, initcolor, element) {
            size = size || 200;
            var w3 = 3 * size / 200,
                w1 = size / 200,
                fi = 1.6180339887,
                segments = 3,//pi * size / 50,
                size20 = size / 20,
                size2 = size / 2,
                padding = 2 * size / 200,
                t = this;

            var H = 1, S = 1, B = 1, s = size - (size20 * 4);
            var r = element ? Raphael(element, size, size) : Raphael(x, y, size, size),
                xy = s / 6 + size20 * 2 + padding,
                wh = s * 2 / 3 - padding * 2;
            w1 < 1 && (w1 = 1);
            w3 < 1 && (w3 = 1);



            // ring drawing
            var a = pi / 2 - pi * 2 / segments * 1.3,
                R = size2 - padding,
                R2 = size2 - padding - size20 * 2,
                path = ["M", size2, padding, "A", R, R, 0, 0, 1, R * Math.cos(a) + R + padding, R - R * Math.sin(a) + padding, "L", R2 * Math.cos(a) + R + padding, R - R2 * Math.sin(a) + padding, "A", R2, R2, 0, 0, 0, size2, padding + size20 * 2, "z"].join();

            for (var i = 0; i < segments; i++) {
                r.path(path).attr({
                    stroke: "none",
                    fill: "#8fd117",
                    transform: "r" + [(360 / segments) * i, size2, size2]
                });
            }

            r.path(["M", size2, padding, "A", R, R, 0, 1, 1, size2 - 1, padding, "l1,0", "M", size2, padding + size20 * 2, "A", R2, R2, 0, 1, 1, size2 - 1, padding + size20 * 2, "l1,0"]).attr({
                "stroke-width": w3,
                stroke: "#fff"
            });

            t.startCursor = r.set();
            var h = size20 * 2 + 2;
            t.startCursor.push(r.rect(size2 - h / fi / 2, padding - 1, h / fi, h, 3 * size / 200).attr({
                stroke: "#00A0C6",
                opacity: .5,
                "stroke-width": w3
            }));
            t.startCursor.push(t.startCursor[0].clone().attr({
                stroke: "#00A0C6",
                opacity: 1,
                "stroke-width": w1
            }));


            t.endCursor = r.set();
            var h = size20 * 2 + 2;
            t.endCursor.push(r.rect(size2 - h / fi / 2, padding - 1, h / fi, h, 3 * size / 200).attr({
                stroke: "#F96E5B",
                opacity: .5,
                "stroke-width": w3
            }));

            t.endCursor.push(t.endCursor[0].clone().attr({
                stroke: "#F96E5B",
                opacity: 1,
                "stroke-width": w1
            }));



            t.ring = r.path(["M", size2, padding, "A", R, R, 0, 1, 1, size2 - 1, padding, "l1,0M", size2, padding + size20 * 2, "A", R2, R2, 0, 1, 1, size2 - 1, padding + size20 * 2, "l1,0"]).attr({
                fill: "#000",
                opacity: 0,
                stroke: "none"
            }); 

            t.H = t.S = t.B = 1;
            t.raphael = r;
            t.size2 = size2;
            t.wh = wh;
            t.x = x;
            t.xy = xy;
            t.y = y;


            t.endCursor.attr({transform: "r" + [50, t.size2, t.size2]});

            // events
            t.ring.drag(function (dx, dy, x, y) {
                t.docOnMove(dx, dy, x, y);
            }, function (x, y) { 
                // Rotate on click 
                t.setH(x - t.x - t.size2, y - t.y - t.size2);
            }, function () { 
            }); 
        },
        proto = ColorWheel.prototype;

    proto.setH = function (x, y) { 

        var d = Raphael.angle(x, y, 0, 0); 

        this.H = (d + 90) / 360;
        var a  = 0;

        if(d > 270) {
            d = d - 270;
        }
        else {
            d = d + 90;
        } 

        var m = Math.abs(d - this.startCursor[0]._.deg);
        var n = Math.abs(d - this.endCursor[0]._.deg);

        if(m > 180) {
            m = 360 - m ;
        }
        if(n > 180) {
            n = 360 - n;
        }    

        if( m <= n) {
            this.startCursor.attr({transform: "r" + [d, this.size2, this.size2]});
        }
        else {
            this.endCursor.attr({transform: "r" + [d, this.size2, this.size2]});
        }

        m = this.startCursor[0]._.deg ;
        n = this.endCursor[0]._.deg;

        if(m > 360) {
            m = m - 360;
        }
        if( n > 360 ) {
            n = n - 360;
        } 

        var diff = m > n ? m - n : n - m;

        this.onchange(m,n,diff);
    };

    proto.docOnMove = function (dx, dy, x, y) {
        this.setH(x - this.x - this.size2, y - this.y - this.size2);

    };

})(window.Raphael);



window.onload = function () {
    var cp2 = Raphael.colorwheel(60, 20, 200, "#eee");
    var X = document.getElementById('x');
    var Y = document.getElementById('y');
    var angle = document.getElementById('angle');

    cp2.onchange = function (x, y, ang) {
        X.innerHTML = Math.round(x * 100) / 100;
        Y.innerHTML = Math.round(y * 100) / 100;
        angle.innerHTML = Math.round(ang * 100) / 100;
    }
};

HTML:

<div id="wrapper">X : <span id="x">0</span>
    <br>Y: <span id="y">50</span> 
    <br>Angle: <span id="angle">50</span> 
</div>

CSS:

  body {
      background: #e6e6e6;
  }
  #wrapper {
      position: absolute;
      top: 240px;
      left: 100px;
  }

UPDATE:

在克里斯的帮助下,

I have got some success.

See Demo http://jsfiddle.net/jashwant/CDBk6/5/

Bugs :
1. If you start green first, red breaks,
2. If you start red first and makes angle of greater than 180 degree and when green reduces that below 180 degree, it breaks again.

UPDATE 2
DEMO http://jsfiddle.net/jashwant/CDBk6/6/
BUGS:
1. If you start red first and makes angle of greater than 180 degree and when green reduces that below 180 degree, it breaks again.
2. Sometimes arcs in opposite direction.


很酷的项目。您只需要向色轮添加椭圆弧并在 onchange 事件上重绘路径即可。

我已经告诉你一半了:如果你移动橙色光标,它会起作用,如果你移动蓝色光标​​,它会完全中断。

开始:

        t.x0 = t.startCursor[0].attr("x") + t.startCursor[0].attr("width") / 2;
        t.y0 = t.startCursor[0].attr("y") + t.startCursor[0].attr("height") / 2;
        t.R1 = (R2 + R) / 2;
        t.x1 = t.x0 + t.R1 * Math.sin(50 * Math.PI / 180);
        t.y1 = t.y0 + t.R1 - t.R1 * Math.cos(50 * Math.PI / 180);

        t.arc = r.path("M" + t.x0 + "," + t.y0 + "A" + t.R1 + "," + t.R1 + " 50 0,1 " + t.x1 + "," + t.y1)
        .attr({
            stroke: "#009900",
            "stroke-width": 10
        });

更新时:

    if (n > 180) {
        flag = 1;
    }

    var diff = m > n ? m - n : n - m;

    t.x0 = t.x0 + t.R1 * Math.sin(m * Math.PI / 180);
    t.y0 = t.y0 + t.R1 - t.R1 * Math.cos(m * Math.PI / 180);
    t.x1 = t.x0 + t.R1 * Math.sin(diff * Math.PI / 180);
    t.y1 = t.y0 + t.R1 - t.R1 * Math.cos(diff * Math.PI / 180);

    t.arc = t.arc.attr("path", "M" + t.x0 + "," + t.y0 + "A" + t.R1 + "," + t.R1 + " " +  diff + " " +  flag + ",1 " + t.x1 + "," + t.y1);

jsfiddle http://jsfiddle.net/CDBk6/3/

应该可以从这里拿走。

5 月 8 日更新:

您可以通过更改差异上的标志(而不是第二个角度上的标志)来解决第一个问题:

    if (diff > 180) { 
        flag = 1;
    }

触发第二个问题的事件是第二个角度(红色手柄)通过 0 度标记。解决这个问题的最简单方法就是如果角度小于第一个角度,则将 360 添加到角度:

    var m = this.startCursor[0]._.deg ;
    var n = this.endCursor[0]._.deg;
    var t = this;        
    var flag = 0;
    var sweep = 1; 

    var path = "";
    if (n < m) {
       m += 360;
    } 

    var diff = Math.abs(m - n); 

    if (diff > 180) { 
        flag = 1;
    }

这是小提琴 http://jsfiddle.net/CDBk6/10/

注意:您遇到的情况是(n > 360) and (m > 360),但这似乎没有必要——在代码中到达此点的角度已经设置为低于 360 度,至少在 Chrome 中是这样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

拉斐尔 js.沿曲线填充颜色 的相关文章

随机推荐

  • Java 日期解析“上午”和“下午”

    使用 SimpleDateFormat 如何解析字符串 2013 05 23T09 18 07 下午 380 0000 我所有的 SimpleDateFormat 字符串都在 p m part 提前致谢 编辑 我们无法控制传入的格式 我试过
  • 如何要求 Neo4j 考虑周期

    Neo4j 似乎故意省略了循环 因此查询如下 MATCH n1 R gt n2 lt R n1 RETURN n1 n2 除非存在两个类型关系 否则始终不返回任何内容R之间n1 and n2 这绝对是可能的 而且是一个糟糕的黑客 但我有一个
  • Oracle:从字符串中删除前 4 个字符

    所以我想从oracle中的字符串中删除前4个字符 这些角色每次都可能不同 就我而言 我需要去掉 IBAN 的前 4 个字符并将它们放在字符串的末尾 我得到了将它们放在字符串末尾的部分 但我无法删除前 4 个字符 我在互联网上找到的每个解决方
  • 我怎样才能安全地执行Python的子集?

    我需要在数据库中存储基本功能的源代码 并允许通过管理界面对其进行修改 这段代码将接受几个数字和字符串作为参数 并返回一个数字或None 我知道 eval 是邪恶的 所以我需要实现一种安全的方法来从基于 python 的网络应用程序中执行 p
  • Django 管理员,无法分组依据:异常值:“dict”对象没有属性“_meta”

    我有一个映射到 postgresql 视图的模型 class AppModel models Model nbr models BigIntegerField blank True null True region models Forei
  • 是否可以从 heroku 检索您的源代码?

    将源代码上传到 Heroku 后 如果需要 例如本地磁盘出现故障 是否可以从那里下载它 由于 Heroku 与 git 的集成 我认为这至少在理论上是可能的 只要去https dashboard heroku com apps YOUR A
  • JavaFX TableView 滚动

    我的 TableView 包含一些数字数据 当我说通过按钮编辑值时 它将单元格的背景更改为绿色 当没有足够的行使表可滚动时 这种方法很有效 一旦表格变得 或从一开始 可滚动 它就会开始表现得很奇怪 它会更改已编辑项目的背景 但它会更改在向下
  • 每次通过 3G 连接时 UDP 端口都会改变

    我正在使用基于java的UDP套接字与3G模块进行通信 但是收到的数据包的端口 有时是IP地址 每次都会改变 这是非常令人惊讶的 这表明我无法为3G模块分配固定的IP 端口并与其通信 而只能依靠传入的数据包来获取目的地信息 有人能告诉我为什
  • ASP.net core 中的 OData 支持

    既然版本 1 已经发布 那么 ASP net core 现在是否支持 oData 我进行了搜索 但我找不到任何这样或那样的说法 编辑 现在可以在https www nuget org packages Microsoft OData Cor
  • 获取 C 中的时区 GMT 偏移量

    我正在使用标准mktime http linux die net man 3 mktime函数来转动struct tm转化为纪元时间值 这tm字段在本地填充 我需要获取 GMT 的纪元时间 tm has a gmtoff字段允许您为此目的设
  • 1e-9 或 -1e9,哪一个是正确的? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我被分配了
  • 如何在 CMake 中构建具有 2 个不同变量值的程序

    我最近移植了我的Qt项目来自qmake to CMake 我的主程序包含一个值 该值取决于 define指示 我想通过外部指定定义指令CMake并构建同一可执行文件的 3 个不同名称的版本 我该怎么做呢 我见过set target prop
  • 从 Doctrine 查询返回数组,而不是对象 - Symfony2

    我正在使用这个 this gt getDoctrine gt getRepository MyBundle MyEntity gt findAll array Query HYDRATE ARRAY 我认为应该确保它返回一个数组的数组 但它
  • Xcode:收到警告“从枚举类型 UIDeviceOrientation 进行隐式转换”

    完整警告 Implicit conversion from enumeration type UIInterfaceOrientation to different enumeration type UIDeviceOrientation
  • wpf:通过调度程序更新多个控件

    我正在使用 SerialPort 类中的事件侦听器从串行端口读取数据 在我的事件处理程序中 我需要使用通过串行端口传入的 xml 数据来更新窗口中的许多 30 40 控件 我知道我必须使用 myControl Dispatcher Invo
  • 创建镜像后 EC2 实例停止工作

    我对 AWS 完全陌生 我设法拥有一个运行 PHPMyAdmin 的实例 然后我立即创建了一个映像 EBS AMI 并且无法再连接到我的 phpmyadmin 界面 我知道这真的很愚蠢 但我不知道为什么会这样 谢谢 确保服务器上所有需要的服
  • make: *** [ ] 错误 1 ​​错误 [重复]

    这个问题在这里已经有答案了 我正在尝试在 gcc 上编译 Pro C 文件 但收到此错误 make MedLib x o Error 1 这是 make 打印的命令 usr bin gcc g fPIC m64 DSS 64BIT SERV
  • 将后缀附加到 csv 文件(或 SQLite 数据库)中的条目列

    我有一个相对较大的 csv 文件 1 2gb 大到我一台计算机上的 2gb RAM 对于一列中的每个条目 我想附加 1C 以便我可以与另一个数据帧 数据库表连接 合并 如果文件不是太大的话 使用起来会很方便read csv导入到data然后
  • findFragmentById 始终返回 null

    我正在 xml 布局中为我的片段定义一个 ID
  • 拉斐尔 js.沿曲线填充颜色

    我创建了一个圆 可以在其中选择沿圆圆周的两个点 我想填充这两点之间的部分 Demo http jsfiddle net jashwant CDBk6 如果你看到演示 我想填充两点之间的角度 JS function Raphael Rapha