开罗图书馆:cairo_line_to功能

时间:2013-12-01 05:01:22

标签: cairo cairoplot

我有遗留代码,使用cairo库绘制png并调用以下函数。我无法理解以下代码。我知道这是一个问题,需要一些代码并提出问题。但如果有人提供,那就太好了。

#define IMAGE_SIZE_W 1024
#define IMAGE_SIZE_H 768

#define GRAPH_MARGIN_L 48
#define GRAPH_MARGIN_R 21
#define GRAPH_MARGIN_B 27
#define GRAPH_MARGIN_T 22

#define GRAPH_SIZE_W (IMAGE_SIZE_W-(GRAPH_MARGIN_L+GRAPH_MARGIN_R))
#define GRAPH_SIZE_H (IMAGE_SIZE_H-(GRAPH_MARGIN_B+GRAPH_MARGIN_T))
#define SCALE_TO_CANVAS(v,low,high,fws,margin,a,b) (((a+b*((v-low)/(high-low)))*fws)+margin)

#define SCALE_TO_CANVAS_Y(v,low,high) SCALE_TO_CANVAS(v,low,high,GRAPH_SIZE_H,GRAPH_MARGIN_T,1,-1)
#define SCALE_TO_CANVAS_X(v,low,high) SCALE_TO_CANVAS(v,low,high,GRAPH_SIZE_W,GRAPH_MARGIN_L,0,1)

void line_to_point(cairo_t *cr,float x, float y){
   cairo_line_to(cr,x,y);
}
void move_to_point(cairo_t *cr,float x, float y){
   cairo_move_to(cr,x,y);
}

我们有x和y的数据并绘制x和y。来电功能是 / * x和y行的计数器数

for(i = 0; i< counter; i++)
{
 move_to_point(cr,SCALE_TO_CANVAS_X(xvals[i-1],lowX,highX),SCALE_TO_CANVAS_Y(yvals[i-1],lowY,highY));
line_to_point(cr,SCALE_TO_CANVAS_X(x,lowX,highX),SCALE_TO_CANVAS_Y(y,lowY,highY));
}

之后调用write_png,这是一种直接的功能。

如果你看,SCALE_TO_CANVAS做了很多我无法弄清楚的计算。 cairo_line_to x和y修改了值并绘制它。

1 个答案:

答案 0 :(得分:0)

我没有仔细观察,但我猜你的x数据介于lowX和highX之间,y数据介于lowY和highY之间。缩放此数据,使其适合图像表面(即0x0和1024x768之间)。

此外,这似乎增加了所有方面的余量(L / R / B / T意味着左,右,下,上)。

如果您想要解释所使用的数学而不仅仅是其含义,请问。

编辑:

好的,我们有数据描述图表中的点。输入数据的左上角位于(lowX,lowY)位置,右下角位于(highX,highY)。

我们要绘制的区域大小为1024x768。因此,我们希望缩放输入数据,使其适合这个空间。为了使事情变得更复杂,我们希望在图表周围保留一个空的边距。这需要左侧的GRAPH_MARGIN_L像素,顶部的GRAPH_MARGIN_T像素等。

因此绘图区域的左上角位于(GRAPH_MARGIN_L,GRAPH_MARGIN_T),右下角位于(1024-GRAPH_MARGIN_R,768-GRAPH_MARGIN_B)。所以我们正在寻找一个将(lowX,lowY)映射到(GRAPH_MARGIN_L,GRAPH_MARGIN_T)和(highX,highY)到(1024-GRAPH_MARGIN_R,768-GRAPH_MARGIN_B)的公式。

在下文中,我们只看一下该点的两个坐标之一,例如: x坐标。对于点x,我们首先计算一个百分比,该百分比描述了它沿轴的距离。 0%应表示“在顶部/左端”,100%表示“在底部/右端”。可用空间从lowX开始并转到highX,因此存在高X-lowX可能值。因此,x-lowX(使“top / left”真的为零)落在这个范围内,(x-lowX)* 100 /(highX-lowX)是我们正在寻找的百分比。

此百分比现在应映射到目标区域。首先,我们通过目标空间的宽度(并除以100,使百分比消失)将其倍增,以便我们有一个跨越可能范围的值。然后我们必须添加尽可能低的值,这样我们就可以得到一个介于低和高之间的值,而不是从零开始并上升到可能的宽度(高 - 低)。

总之,公式变为minimumTargetX +(x-lowX)/(highX-lowX)* widthOfTheTargetArea,或者根据您的定义:GRAPH_MARGIN_L +(x-lowX)/(highX-lowX)* GRAPH_SIZE_W。

GRAPH_TO_CANVAS中使用的附加变量a和b用于“交换方向”。看起来不是在左上角有(0,0),而是在右下角有正坐标,你的坐标系左下角有(0,0),正坐标到右边/最佳。为了处理这个问题,上面计算的百分比乘以-1,并且将1添加到坐标,以使映射真正将点映射到它应该的每个其他点。这些是GRAPH_TO_CANVAS宏的最后两个参数。

我希望这可以帮助您理解宏。