生成具有可变尺寸的光刻阵列

时间:2014-09-17 14:58:13

标签: graphics

首先,我必须道歉,因为我是化学家而不是程序员,所以我冒险进入未知领域。

我正在开发一些微合同印刷模式,以创建受控细胞生长的模板。模板的主模型打印在A4透明度上,无论我使用多少空间,成本大致相同。我的一个模式大约是2 x 2 mm,所以你可以想象我可以在主模板上放多少。

考虑到这一点,我想要做的是生成重复的圆圈和轨道数组。这在adobe illustrator中很容易实现,但它变得乏味。我想自动改变圆的尺寸,连接它们的轨道宽度以及圆圈之间的空间。

例如,我可能想要一个20 x 20网格的30微米圆圈连接10毫米宽的轨道,边缘之间的圆圈为150微米。

我希望在Matlab中这样做,因为我目前正在学习Matlab的一些图像处理功能。

可以看到最终产品的样子: http://www.nature.com/srep/2014/140424/srep04784/full/srep04784.html http://pubs.rsc.org/en/Content/ArticleLanding/2011/LC/c1lc20257j#!divAbstract

我很欣赏一些方向:

  1. 在Matlab中这样做是不是一个好主意开始?
  2. 设置代码以生成"网格"圈子
  3. 用垂直,水平或对角线连接这些圆圈
  4. 我觉得这是以前有人做过的事情,所以即使指着我可以学习的类似代码也会有很多帮助
  5. 谢谢!

1 个答案:

答案 0 :(得分:0)

我不熟悉Matlab所以我不能告诉你0)。

以下是1)和3)的可能答案。如果您认为我的答案可以帮助您,我可以写一些关于2)的代码。

图书馆d3.js可能对您正在做的事情感兴趣。它基本上允许您将数据绑定到svg元素。

以下是您可以做的一个示例。我们假设您的数据是圈子属性列表(大小,位置)

JSFiddle here

data = [ {x: 20µm, y:250µm, radius: 250µm}, {....}, ... ]

//Dimensions of what will be dsplayed in your browser
width = 500px
height = 700px

//d3.js provides functions to automatically resize your data to the viewport (maps domain -> range)
xScale = d3.scale.linear()
   .domain([0, a4_format_size_x])
   .range([0, width])
yScale = d3.scale.linear()
   .domain([0, a4_format_size_y])
   .range([0, height])
rScale = d3.scale.linear()
   .domain([0, max_circle_size])
   .range([0, 20])

svg = d3.select(element[0])
            .append("svg")
            .attr("width", width)
            .attr("height", height)

svg.selectAll("circle") 
  .data(data)   // This line binds your date to SVG elements
  .enter()      
  .append("circle")
      .attr("cx", function(data) { return xScale(data.x)})
      .attr("cy", function(data) { return yScale(data.y)})
      .attr("r", function(data) { return rScale(data.radius)}

注意:语法selectAll>输入>追加可能看起来很奇怪,如果你感到困惑,请随时查看this

现在为了生成数据本身("圆圈网格"),您可能会有类似

的内容
var numCirclesX = 500
var numCirclesY = 700

var data = []

for(var i=0; i<numCirclesX; i++){
    for(var j=0; j<numCirclesY, j++){
        data.push({ x: i*size_A4_x/numCirclesX,
                  y: j*size_A4_y/numCirclesY,
                  radius: 5 })
    }
}