Raphael svg反转y轴坐标

时间:2011-12-11 19:22:59

标签: javascript svg raphael

我正在使用http://raphaeljs.com/的Raphael库,并在图表库上工作。对于此库,当Y轴反转时非常有用。现在0,0位于左上角,但我希望它位于左下角。

有可能将一个比例矩阵应用于一个元素,但我想要将坐标反转为我画的任何东西。有线索吗?

3 个答案:

答案 0 :(得分:6)

我能想到的唯一方法是使用CSS对svg元素应用负缩放(请参阅此fiddle)。 (我使用jQuery添加样式)。

但这并非没有问题。例如,文本将被镜像,除非你做一些反镜像(比如应用我使用Raphael.el添加到元素的invert()方法):

Raphael.el.invert = function() {
    this.transform('s1,-1');
};

此外,如果您要使用鼠标与元素进行交互,则必须调整内容。请注意,黑色圆圈使用非常标准的mouseMove函数,但它不起作用 - 它在y中以错误的方向移动。所以你必须像我对其他圈子做的那样做:

function cMove(dx, dy, x,y) {
    this.attr('cx', x);
    this.attr('cy', paperHeight - y);
};

简而言之,这并不优雅,我尝试的其他任何事情都没有更好。我知道这不是你想听到的,但我建议你不要习惯坐标系,除非你只是计划显示静态图表。

答案 1 :(得分:0)

Mike C的解决方案的一个小问题是,您必须知道在创建文本时文本是否会被反转。如果你想在最后确保正面朝上的文本(在应用其他转换之后),我发现它可以很好地改变文本元素的.transform()以在最后将文本的比例翻转到右侧。

function InvertText(ObjSet){
// This function resets the inversion of text such that it is always right side up
// ObjSet is a raphael paper.set() object

for (var i=0; i<ObjSet.items.length; i++){
    var ThisObj = ObjSet.items[i];
    if (ThisObj.type == 'text'){
        var tArr = ThisObj.transform();

        // Find the scaling factor
        for (var j=0; j<tArr.length; j++){
            if (tArr[j][0] == 's'){
                tArr[0][2] = 1;
                break;
            }
        }
        ThisObj.transform(tArr);
    }
}
}

您可以这样使用:

var ObjSet = paper.set().push(
        paper.text(0,10,'FirstText'),
        paper.path('M,0,0,v,100,h,20,v,-100,h,-20'),
        paper.circle(0,0,5)
        );

//Flip everything on the y-axis
ObjSet.transform('s,1,-1, T,100,100');

// Make the text right-side-up
InvertText(ObjSet);

答案 2 :(得分:0)

Here's how to do it只是使用RaphaelJS变换,没有CSS转换。

var SCALE = 2;

var paper = Raphael(0, 0, 400, 700);

// box notched at bottom-center and right-center
var p = paper.path("M0,0 L100,0 L100,40 L90,50 L100,60 L100,100 L60,100 L50,90 L40,100 L0,100 Z");

var bounds = p.getBBox();

p.attr({
  stroke: 'none',
  fill: [90, '#578A6E', '#34573E'].join("-")
})
.transform("t"+ (-bounds.width/2) +","+ (-bounds.height/2) +
       "s"+ SCALE +","+ (-SCALE) +
       "t"+ (bounds.width/2) +","+ (-bounds.height/2));

Raphael从元素边界框的中心应用比例变换,而不是从原点开始。要在缩放之前反转y轴,偏移,然后再次偏移。