基于R语言DIY乐高拼图,苏大强表情包为例

概述

利用R语言盘一个苏大强表情包乐高拼图

很多人喜欢乐高积木,但是苦于囊中羞涩,媳妇不给钱买,怎么办呢?不要愁!虫虫今天给大家介绍一个很有意思的项目brickr,利用它我们可以利用R语言编程来玩乐高积木,学习游戏两不误,何乐而不为呢?

brickr是基于R tidyverse和rayshader包来创建LEGO 2D和3D模型的工具包。利用它我们可以:

将图像文件转换为2D和3D LEGO马赛克

从简单的数据框架构建3D乐高模型

安装

必备软件和包:

必须安装Rgui(或RStudio),Rtools,基本依赖包devtoolstidyverserayshaderdplyr等。

RRtools必须下载二进制安装包安装。

依赖包的安装方法很简单直接利用install.packages("XXX")

安装brickr

安装brickr要利用devtools从github库安装,安装方法如下:

devtools::install_githu("ryantimpe/brickr")

基本使用

3D建模

3D模型可以用两种方法构建:bricks_from_table函数和或bricks_from_coords函数。

bricks_from_table():将矩阵数组转换为乐高积木。对于简单模型,可以通过data.frame()或tibble::tribble()函数手动构建。对于更高级的模型,建议可以通过Excel或.csv文件导入数据。导入的表格数据中最左侧的列与模型的Level或z轴相关联。默认情况下,该功能会将此值转换为数字。其他列是x坐标,每行是y坐标。

bricks_from_coords():则使用用带有x,y和z整数值以及颜色列的数据框,其中x,y和z的每个组合都是三维空间中的一个点。颜色必须是display_colors()列出的官方乐高颜色名称。这种方法比bricks_from_table函数更灵活,还允许进行3D模型的编程开发。

将任何brick_from _*()函数的输出传递给display_bricks()就可以查看其3D模型图。从一个简单例子开始:

library(brickr)
CC <- data.frame(
  Level="A",
  X1 = rep(1,4),
  X2 = rep(1,4)
)
CC

结果:

利用R语言盘一个苏大强表情包乐高拼图

打印这个图

CC %>%
  bricks_from_table() %>%
  display_bricks()
rayshader::render_snapshot()
利用R语言盘一个苏大强表情包乐高拼图

上色

有两种方法给brickr上色。display_colors()可以列出,支持的颜色标识ID和名称:

利用R语言盘一个苏大强表情包乐高拼图

在模型输入表中使用brickrID值而不是"1"。值"0"表示空值。

创建颜色分配表并将其传递给bricks_from_table()即可,比如:

CC_colors <- data.frame(
  .value = 1,
  Color = "Bright blue"
)
CC %>%
  bricks_from_table(CC_colors) %>%
  display_bricks()
rayshader::render_snapshot()

结果显示:

利用R语言盘一个苏大强表情包乐高拼图

堆积

输入数组的Level列确定砖块的高度。bricks_from_table()会将字母数字级别转换为z坐标。

CC <- data.frame(
  Level= c(rep("A",4), rep("B",4)),
  X1 = rep(1,4),
  X2 = rep(1,4)
)
CC %>%
  bricks_from_table(brick_colors) %>%
  display_bricks()
rayshader::render_snapshot()

结果:

利用R语言盘一个苏大强表情包乐高拼图

同理,我们可叠更多的层,不同的层使用不同的颜色

CC <- data.frame(
  Level="A",
  X1 = rep(1,4),
  X2 = rep(1,4)
)
1:10 %>%
  purrr::map_df(~dplyr::mutate(CC, Level = LETTERS[.x], X1 = .x, X2 = .x)) %>%
  bricks_from_table() %>%
  display_bricks()
rayshader::render_snapshot()

结果如下:

利用R语言盘一个苏大强表情包乐高拼图

一个比较大的模型

对于较大的模型,可以使用tibble::tribble(),从而更轻松地显示模型。如果在大一点的模型就需要从外部文件(exce)导入数据了。下面是一个使用tibble::tribble()的实例:

Chongchong_model <- tibble::tribble(
  ~Level, ~X1, ~X2, ~X3, ~x4, ~x5, ~X6, ~x7, ~x8,
  "A", 1, 1, 1, 0, 1, 1, 1, 1,
  "A", 1, 0, 0, 0, 0, 0, 0, 1,
  "A", 1, 0, 0, 0, 0, 0, 0, 1,
  "A", 1, 1, 1, 1, 1, 1, 1, 1,
  "B", 1, 0, 1, 0, 1, 1, 0, 1,
  "B", 1, 0, 0, 0, 0, 0, 0, 1,
  "B", 1, 0, 0, 0, 0, 0, 0, 1,
  "B", 1, 0, 1, 0, 0, 1, 0, 1,
  "C", 1, 1, 1, 1, 1, 1, 1, 1,
  "C", 1, 0, 0, 0, 0, 0, 0, 1,
  "C", 1, 0, 0, 0, 0, 0, 0, 1,
  "C", 1, 1, 1, 1, 1, 1, 1, 1,
  "D", 2, 2, 2, 2, 2, 2, 2, 2,
  "D", 1, 0, 0, 0, 0, 0, 0, 1,
  "D", 1, 0, 0, 0, 0, 0, 0, 1,
  "D", 2, 2, 2, 2, 2, 2, 2, 2,
  "E", 0, 0, 0, 0, 0, 0, 0, 0,
  "E", 2, 2, 2, 2, 2, 2, 2, 2,
  "E", 2, 2, 2, 2, 2, 2, 2, 2,
  "E", 0, 0, 0, 0, 0, 0, 0, 0
)
Chongchong_colors <- tibble::tribble(
  ~`.value`, ~Color,
  1, "Bright green",
  2, "Dark orange"
)
Chongchong_model %>%
  bricks_from_table(Chongchong_colors) %>%
  display_bricks(theta = 210)
rayshader::render_snapshot()

结果显示如下:

利用R语言盘一个苏大强表情包乐高拼图

以编程方式构建模型

使用bricks_from_coords()以编程方式构建3D LEGO模型,而不是通过表格手动绘。使用该函数,必须要提供x,y和z的坐标数组,以及每个点的颜色名称。比如:

library(brickr)
radius <- 4
sphere_coords <- expand.grid(
  x = 1:round((radius*2.5)),
  y = 1:round((radius*2.5)),
  z = 1:round((radius/(6/5)*3))
) %>%
  mutate(
    dist = (((x-mean(x))^2 + (y-mean(y))^2 + (z-mean(z))^2)^(1/2)),
    Color = case_when(
      between(dist, (radius-1), radius) & (x+y+z) %% 6 %in% 0:1 ~ "Bright green",
      dist <= radius ~ "Bright red"
  ))
sphere_coords %>%
  bricks_from_coords() %>%
  display_bricks(phi = 30, theta = 30)
rayshader::render_snapshot()

结果如下:

利用R语言盘一个苏大强表情包乐高拼图

马赛克

马赛克功能可以对导入的JPG或PNG图像文件用乐高颜色和brick渲染生成2D和3D的马赛克拼图。我们以最近流行的苏大强表情为原始图进行处理:

2D马赛克

原始图:

利用R语言盘一个苏大强表情包乐高拼图

对原始图做渲染处理,渲染出蒙太奇拼图效果

mosaic1 <- jpeg::readJPEG("sdq.jpg") %>%
image_to_bricks(img_size = 148)
mosaic1 %>% display_set()

显示效果图如下:

利用R语言盘一个苏大强表情包乐高拼图

分辨率太高显示不出拼图效果来,我们把分辨率调小:

mosaic1 <- jpeg::readJPEG("sdq.jpg") %>%
scale_image(img_size = 48) %>%
legoize() %>%
collect_bricks()

效果如下:

利用R语言盘一个苏大强表情包乐高拼图

image_to_brick函数可以参数设置如下:

img_size: 单个值(例如148)表示图像裁剪为正方形;2元素阵列c(56,48)将输出宽度*高度的矩形图像。

color_table:马赛克中可能的拼块颜色的数据框。默认为包含的数据集lego_colors。

brightness:大于1的值将使图像变亮,而小于1的值将使图像变暗。

display_set(): 引入的ggplot图像。

3D马赛克

另外两个函数可以以使用rayshader包将image_to_bricks数据输出转换为3D马赛克:

**collect_3d(): **将2D LEGO马赛克转换为两个矩阵:一个用于彩色图像,另一个用于图像上每个点的高度。默认情况下,生成的图像具有6个LEGO板(2个LEGO砖)的高度,颜色较浅,具有较高的高度。可以使用mosaic_height设置马赛克的高度,通过highest_el ='dark'设置最高的砖块以较暗的颜色。

display_3d: 调用rayshader::plot_3d(),但是从collect_3d的输出中提取山体阴影和高程矩阵并修复一些参数。更详细信息参考rayshader::plot_3d()的官方文档。比如:

library(rayshader)
mosaic1 %>%
collect_3d() %>%
display_3d(fov=0,theta=-20,phi=30,windowsize=c(1000,800),zoom=0.7)
render_snapshot()

3D拼图效果如下:

利用R语言盘一个苏大强表情包乐高拼图

乐高马赛克IRL

该项目还支持,建立乐高马赛克拼图过程图集。具体功能介绍如下:

使用generate_instructions()将LEGO马赛克图像分解为更易于阅读的构建集合的步骤。默认为6步,具体步骤可以通过整数参数设置。

mosaic1 %>% generate_instructions(9)
利用R语言盘一个苏大强表情包乐高拼图

实需部件计数

当然brickr实际上不是一个纯指上谈兵的项目,而是一个可以线下实操的项目,项目可以这些提供功能,包括display_piecetable_pieces函数。

使用display_pieces()函数可以生成所有必需的插图块的形状和数量。这些按颜色和大小排序,可以适用男高级搜索选项在乐高官网的Pick-a-Brick购买,当然前提是你必须先让媳妇批准你的预算。也可以使用table_pieces()生成所有必需砖块的数据框表。

mosaic1 %>% display_pieces()
利用R语言盘一个苏大强表情包乐高拼图
mosaic1 %>% table_pieces()
利用R语言盘一个苏大强表情包乐高拼图

怎么样,少年?是不是心动了,那就赶紧整一个,拼呗。什么?没钱!那好吧,今天的内容就到这里,欢迎关注虫虫。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349