裁布机刀尖跟随

这是一个用刀模拟裁布的过程,因为刀尖是受刀的控制点控制,为了达到尽量精确,只能把刀尖点转换为控制点,然后插补过去。

% 计算线段的角度
function theta = get_line_angle(point1, point2)    
    v_x = point2(1) - point1(1);
    v_y = point2(2) - point1(2); 
    L = sqrt(v_x^2 + v_y^2);
    
    %防止线段长度为零的情况
    if L < 1e-4
        theta = 0;
        return
    end
    theta = acos(v_x / L)*180/pi;
    if v_y < 0
        theta = 360 - theta;
    end
% 计算线段之间的夹角在-180-180度之间
function theta = get_inter_angle(v1_x, v1_y, v2_x, v2_y)
    
    new_x = (v1_x * v2_x + v1_y * v2_y);
    new_y = (v1_x * v2_y - v2_x * v1_y);

    theta = acos(new_x / sqrt(new_x^2 + new_y^2))*180/pi;
    if new_y < 0
        theta =  -theta ;
    end
%得到刀的控制点中心
function new_points = get_control_points(L, points)

new_points = [];
n = size(points,1);
v_inter_step = 0;
for i = 1:n  
    pre_i = max(1,i-1);
    next_i = min(n,i+1);
    point1 = points(pre_i,:);
    point2 = points(i,:);
    point3 = points(next_i,:);
    if norm(point3 - point1)<eps || v_inter_step == 1
        v_inter_step = v_inter_step + 1;
    else
        v_inter_step = 0;
    end
    if i == 1
        line_angle = get_line_angle(point2,point3); 
        inter_angle = 0;
    elseif i==n
        line_angle = new_points(end,3);
        inter_angle = 0;
    else
        v1_x = point2(1) - point1(1);
        v1_y = point2(2) - point1(2); 
        v2_x = point3(1) - point2(1);
        v2_y = point3(2) - point2(2);
        line_angle = new_points(end,3);
        if v_inter_step == 2       
            inter_angle = get_inter_angle(-v1_x,-v1_y,v2_x,v2_y);
        else         
            inter_angle = get_inter_angle(v1_x,v1_y,v2_x,v2_y);
        end        
    end   
    arc_angle = (line_angle +  inter_angle)*pi/180;
    knife_vect = L*[cos(arc_angle),sin(arc_angle)];
    max_inter_angle = 10;
    if abs(inter_angle)<20
         temp_points = [point2 - knife_vect,line_angle +  inter_angle,i];      
    elseif v_inter_step == 1
         temp_points = [point2 + knife_vect,line_angle - 180 + inter_angle,i] ;              
    else     
        m = floor(abs(inter_angle)/max_inter_angle)+1;
        temp_points = zeros(m,4);
        for j = 0:m
            new_angle = (line_angle + j*inter_angle/m)*pi/180;
            new_knife_vect = L*[cos(new_angle),sin(new_angle)];
            temp_points(j+1,:) = [point2 - new_knife_vect, line_angle + j*inter_angle/m,i];
        end        
    end
    new_points = [new_points;temp_points];     
end    
%main函数
%模拟刀的跟随裁剪
clc;clear all;
points = [0    0
490  0
500  20
510  0
1000 0
1000 1000
500  1000
500  995
500 1000
0    1000
0    500
5    500
0    500
0    0];
    
knife_e = 50;
new_points = get_control_points1(knife_e, points);
n = size(new_points,1);
for i = 1: n-1
    p1 = new_points(i,:);
    p2 = new_points(i+1,:);
    L = norm(p2 - p1);
    m = floor(L/10) + 1;
    for j = 0:m
        p = ((m - j)*p1 + j*p2 )/m;
        p_start = [p(1),p(2)];
        t = p(3)*pi/180;
        p_end = p_start + knife_e * [cos(t) sin(t)];
        plot(points(:,1),points(:,2),'-s')
        hold on
        axis equal;
        plot(new_points(:,1),new_points(:,2),'-*')
        plot([p_start(1),p_end(1)],[p_start(2),p_end(2)],'-*');
        text(p_start(1), p_start(2) ,'start')
        text(p_end(1), p_end(2) ,'end')
        hold off
        pause(0.1);
    end
    pause(0.3);
end    
图片.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 前言 箱包手袋行业的成本核算,永远是每位老板极为关心的问题,因为它能让企业生存,它能让客人停留,它能让客人相信事实...
    todywu阅读 3,467评论 0 53
  • 《六项精进》 第530期学员 乐观二组成员 姓名:路丽飞 公司:小小美甲上海店 【日精进打卡第285天】 【知~学...
    飞飞路LF阅读 72评论 0 0
  • 简介 GitHub Trending:Trending GitHub趋势:github-trending Tren...
    javaBoy_hw阅读 1,010评论 0 0
  • 复盘和反思的区别是什么?得到的回答五花八门,在这里我想表达一下我的观点: • 复盘和反思,都是假设校验的一种有效工...
    汪顺唯阅读 1,662评论 0 0
  • 人的一生有时就是如此的诡异,就好像作家陶杰所说,“你做出抉择的那一日,在日记上相当沉闷和平凡。当时还以为是...
    天上有神仙阅读 189评论 0 1