当前位置: 首页 > 知识库问答 >
问题:

快速拉伸倾斜GTK和开罗

易烨磊
2023-03-14

我是开罗和GTK的新手,我正在制作的程序需要绘制500x500或1000x1000的圆形平铺。此外,在绘图之前还有一些工作要做,但现在我专注于绘图部分,这将涉及鼠标交互来改变任何圆形的颜色。

因此,平铺是相同的,并且随着时间的推移,圆圈必须改变其颜色(全部)。我必须检查每个圆圈并执行操作,并且在检查所有圆圈后,我必须显示更改。此过程必须执行任意次数。

现在我有一个滚动窗口的平铺,但是仅仅用这个滚动就需要很多时间。提前感谢。我的代码是下一个:

#include <cairo.h>
#include <gtk/gtk.h>
#include <math.h>

static void do_drawing(cairo_t *, GtkWidget *);
static int cellRadius=5;
static int cellDiameter=10;
static int latticeSideSize=500;

static gboolean on_draw_event(GtkWidget *widget, cairo_t *cr, gpointer user_data){  
    do_drawing(cr, widget);  
    return FALSE;
}

static void do_drawing(cairo_t *cr, GtkWidget *widget)
{
  int i=0,j=0;
  GtkWidget *win = gtk_widget_get_toplevel(widget);

  int width, height;
  gtk_window_get_size(GTK_WINDOW(win), &width, &height);

  cairo_set_line_width(cr, .5);  
  cairo_set_source_rgb(cr, 0.69, 0.19, 0);
  cairo_save (cr);

  for(i=0;i<latticeSideSize;i++){

    for(j=0;j<latticeSideSize;j++){
      if(i%2 == 0){
        cairo_arc(cr, cellRadius + 2*cellRadius + j*cellDiameter, cellRadius + cellRadius + i*cellDiameter, cellRadius, 0, 2 * M_PI);
        cairo_stroke(cr);
      }else{
        cairo_arc(cr, cellRadius + cellRadius + j*cellDiameter, cellRadius + cellRadius + i*cellDiameter, cellRadius, 0, 2 * M_PI);
        cairo_stroke(cr);
      }

    }

  }
  cairo_restore (cr);
}

static void destroy( GtkWidget *widget, gpointer   data ){
    gtk_main_quit ();
}

int main (int argc, char *argv[])
{
  GtkWidget *window;
  GtkWidget *scrolled_window;
  GtkWidget *darea;

  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
  scrolled_window = gtk_scrolled_window_new (NULL, NULL); 
  darea = gtk_drawing_area_new();
  gtk_container_add(GTK_CONTAINER(scrolled_window), darea);
  gtk_container_add(GTK_CONTAINER(window), scrolled_window);

  g_signal_connect(G_OBJECT(darea), "draw", G_CALLBACK(on_draw_event), NULL);
  g_signal_connect(G_OBJECT(scrolled_window), "destroy", G_CALLBACK(gtk_main_quit), NULL);

  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  gtk_widget_set_size_request( scrolled_window, 500, 500 );
  gtk_window_set_default_size(GTK_WINDOW(window), 1024, 800); 
  gtk_widget_set_hexpand( scrolled_window, TRUE );
  gtk_widget_set_vexpand( scrolled_window, TRUE );
  gtk_window_set_title(GTK_WINDOW(window), "HexaGrid");
  gtk_widget_set_size_request(darea,cellDiameter*latticeSideSize + 20,cellDiameter*latticeSideSize + 20);

  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
  gtk_container_set_border_width(GTK_CONTAINER (scrolled_window), 10);

  gtk_widget_show_all(window);

  gtk_main();

  return 0;
}

共有1个答案

苏彭薄
2023-03-14

这里有两个问题。首先,每次绘制都要进行250000次同样的计算(圆圈),如果滚动平滑,则每秒需要1500万个圆圈:这不是一个现实的要求。您可能应该做一次圆,然后使用CAIRO_EXTEND_REPEAT扩展模式应用与表面填充图案相同的结果。您可以使用cairo_translate()设置图案的位置,然后使用 将圆形图案设置为源,然后 cairo_rectangle() 绘制它。开罗示例包含一个使用位图的示例。

如果某些圆圈需要采用不同的颜色,您可以“手动”绘制部分或全部圆圈(无需重复扩展模式),但使用图案仍然是避免多次计算圆圈的好主意。

第二,在复杂的窗口小部件的情况下,不绘制整个窗口小部件而只绘制脏区域是有意义的:参见draw-signal文档。

 类似资料:
  • 本文向大家介绍拉伸相关面试题,主要包含被问及拉伸时的应答技巧和注意事项,需要的朋友参考一下 “ a”标签是内联级别元素。没有内联级别元素可以设置其宽度。为什么?因为内联级别的元素是要表示流畅的文本的,所以理论上可以从一行换行到另一行。在这种情况下,提供元素的宽度是没有意义的,因为您不一定知道它是否要包装。为了设置其宽度,您必须将其显示属性更改为或: 如果有内存,则 可以 在IE6中的某些内联级别元

  • 问题内容: 有谁知道如何用scipy绘制偏态正态分布?我认为可以使用stats.norm类,但我不知道如何使用。此外,如何估计描述一维数据集偏斜正态分布的参数? 问题答案: 根据Wikipedia的描述, 如果你想找到一个数据集的使用规模,位置和形状参数,例如使用,并且, 应该给你类似的东西,

  • 选择索引        在“倾斜摄影”菜单栏中点击“打开数据”,找到本地倾斜摄影索引(lfp)文件存放位置,点击打开osgb转换后的lfp格式倾斜摄影数据文件(具体转换步骤见“倾斜摄影”菜单栏中的“数据转换”),该lfp文件包含三维模型所在的经度、纬度、高度值,便于倾斜摄影三维模型在地球上进行定位。支持倾斜摄影三维模型格式为smart3d和大疆智图生成的osgb格式。        打开后数据效果

  • 视锥体的参数,orientation设置初始值0,为什么出现倾斜?

  • 问题内容: 我有我的.. 我加入的一个。当页面内容为屏幕时,它起作用。但是当我没有收到太多数据并且不是时,就会出现问题,该功能无法正常工作。:( 我没有使用。 有人可以帮我解决这个问题吗? 问题答案: var alwaysBounceVertical:Bool //默认为NO。如果是,并且反弹为是,即使内容小于界限,也允许垂直拖动

  • 我开发了一个用于全屏显示相机预览的小应用程序。我使用的是摄像头API。 这是活动布局: 当设备在纵向时,显示器是垂直缩放的,以匹配设备屏幕的高度——所以宽高比不同于本地相机的宽高比。这两张图片更好地解释了我所说的: 第一幅图像是用本机相机设备拍摄的。第二幅图像是用我的应用程序制作的,相机全屏显示——图像倾斜、拉伸以适应屏幕。 我需要将相机预览设置为全屏,而不考虑mehod给定的预览大小,并且不失真