[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6XDZQJ676BTM65MZ8EX3KFY":3,"skill-same:01M6XDZQJ676BTM65MZ8EX3KFY":64},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":32,"linkOnly":33,"markdownContent":34,"markdownBody":35,"frontMatter":36,"refName":37,"commitSha":38,"skillDirectory":39,"forksCount":13,"repositoryHtmlUrl":40,"repositoryHomepageUrl":6,"ownerHtmlUrl":41,"ownerBlogUrl":6,"ownerDescription":42,"updatedAt":43,"install":44,"resources":57},"01M6XDZQJ676BTM65MZ8EX3KFY","hex-grid-spatial",null,"Hex grid spatial utilities for offset coordinate systems. Use when working with hexagonal grids, calculating distances, finding neighbors, or spatial queries on hex maps.","Waaaalnut\u002Fskillsbench","Waaaalnut","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F103995656?v=4","01M6XCS9K1V51EY3JMB7DGMX24","01M6XCS9Q4WPW88W62C55G1H44",0,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fciv6-adjacency-optimizer\u002Fenvironment\u002Fskills\u002Fhex-grid-spatial\u002FSKILL.md",[],[18,19,20,21,22,23,24,25,26,27,28,29,30,31],"Spatial","hex","grid","hex grid spatial","use","maps","queries","coordinate","systems","Utilities","with","for","hexagonal","when","2026-11-10 10:12:30",false,"---\nname: hex-grid-spatial\ndescription: Hex grid spatial utilities for offset coordinate systems. Use when working with hexagonal grids, calculating distances, finding neighbors, or spatial queries on hex maps.\n---\n\n# Hex Grid Spatial Utilities\n\nUtilities for hexagonal grid coordinate systems using **odd-r offset coordinates** (odd rows shifted right).\n\n## Coordinate System\n\n- Tile 0 is at bottom-left\n- X increases rightward (columns)\n- Y increases upward (rows)\n- Odd rows (y % 2 == 1) are shifted right by half a hex\n\n## Direction Indices\n\n```\n     2   1\n      \\ \u002F\n   3 - * - 0\n      \u002F \\\n     4   5\n\n0=East, 1=NE, 2=NW, 3=West, 4=SW, 5=SE\n```\n\n## Core Functions\n\n### Get Neighbors\n\n```python\ndef get_neighbors(x: int, y: int) -> List[Tuple[int, int]]:\n    \"\"\"Get all 6 neighboring hex coordinates.\"\"\"\n    if y % 2 == 0:  # even row\n        directions = [(1,0), (0,-1), (-1,-1), (-1,0), (-1,1), (0,1)]\n    else:  # odd row - shifted right\n        directions = [(1,0), (1,-1), (0,-1), (-1,0), (0,1), (1,1)]\n    return [(x + dx, y + dy) for dx, dy in directions]\n```\n\n### Hex Distance\n\n```python\ndef hex_distance(x1: int, y1: int, x2: int, y2: int) -> int:\n    \"\"\"Calculate hex distance using cube coordinate conversion.\"\"\"\n    def offset_to_cube(col, row):\n        cx = col - (row - (row & 1)) \u002F\u002F 2\n        cz = row\n        cy = -cx - cz\n        return cx, cy, cz\n\n    cx1, cy1, cz1 = offset_to_cube(x1, y1)\n    cx2, cy2, cz2 = offset_to_cube(x2, y2)\n    return (abs(cx1-cx2) + abs(cy1-cy2) + abs(cz1-cz2)) \u002F\u002F 2\n```\n\n### Tiles in Range\n\n```python\ndef get_tiles_in_range(x: int, y: int, radius: int) -> List[Tuple[int, int]]:\n    \"\"\"Get all tiles within radius (excluding center).\"\"\"\n    tiles = []\n    for dx in range(-radius, radius + 1):\n        for dy in range(-radius, radius + 1):\n            nx, ny = x + dx, y + dy\n            if (nx, ny) != (x, y) and hex_distance(x, y, nx, ny) \u003C= radius:\n                tiles.append((nx, ny))\n    return tiles\n```\n\n## Usage Examples\n\n```python\n# Find neighbors of tile (21, 13)\nneighbors = get_neighbors(21, 13)\n# For odd row: [(22,13), (22,12), (21,12), (20,13), (21,14), (22,14)]\n\n# Calculate distance\ndist = hex_distance(21, 13, 24, 13)  # Returns 3\n\n# Check adjacency\nis_adj = hex_distance(21, 13, 21, 14) == 1  # True\n\n# Get all tiles within 3 of city center\nworkable = get_tiles_in_range(21, 13, 3)\n```\n\n## Key Insight: Even vs Odd Row\n\nThe critical difference is in directions 1, 2, 4, 5 (the diagonal directions):\n\n| Direction | Even Row (y%2==0) | Odd Row (y%2==1) |\n|-----------|-------------------|------------------|\n| NE (1) | (0, -1) | (1, -1) |\n| NW (2) | (-1, -1) | (0, -1) |\n| SW (4) | (-1, +1) | (0, +1) |\n| SE (5) | (0, +1) | (1, +1) |\n\nEast (0) and West (3) are always (1, 0) and (-1, 0).\n","# Hex Grid Spatial Utilities\n\nUtilities for hexagonal grid coordinate systems using **odd-r offset coordinates** (odd rows shifted right).\n\n## Coordinate System\n\n- Tile 0 is at bottom-left\n- X increases rightward (columns)\n- Y increases upward (rows)\n- Odd rows (y % 2 == 1) are shifted right by half a hex\n\n## Direction Indices\n\n```\n     2   1\n      \\ \u002F\n   3 - * - 0\n      \u002F \\\n     4   5\n\n0=East, 1=NE, 2=NW, 3=West, 4=SW, 5=SE\n```\n\n## Core Functions\n\n### Get Neighbors\n\n```python\ndef get_neighbors(x: int, y: int) -> List[Tuple[int, int]]:\n    \"\"\"Get all 6 neighboring hex coordinates.\"\"\"\n    if y % 2 == 0:  # even row\n        directions = [(1,0), (0,-1), (-1,-1), (-1,0), (-1,1), (0,1)]\n    else:  # odd row - shifted right\n        directions = [(1,0), (1,-1), (0,-1), (-1,0), (0,1), (1,1)]\n    return [(x + dx, y + dy) for dx, dy in directions]\n```\n\n### Hex Distance\n\n```python\ndef hex_distance(x1: int, y1: int, x2: int, y2: int) -> int:\n    \"\"\"Calculate hex distance using cube coordinate conversion.\"\"\"\n    def offset_to_cube(col, row):\n        cx = col - (row - (row & 1)) \u002F\u002F 2\n        cz = row\n        cy = -cx - cz\n        return cx, cy, cz\n\n    cx1, cy1, cz1 = offset_to_cube(x1, y1)\n    cx2, cy2, cz2 = offset_to_cube(x2, y2)\n    return (abs(cx1-cx2) + abs(cy1-cy2) + abs(cz1-cz2)) \u002F\u002F 2\n```\n\n### Tiles in Range\n\n```python\ndef get_tiles_in_range(x: int, y: int, radius: int) -> List[Tuple[int, int]]:\n    \"\"\"Get all tiles within radius (excluding center).\"\"\"\n    tiles = []\n    for dx in range(-radius, radius + 1):\n        for dy in range(-radius, radius + 1):\n            nx, ny = x + dx, y + dy\n            if (nx, ny) != (x, y) and hex_distance(x, y, nx, ny) \u003C= radius:\n                tiles.append((nx, ny))\n    return tiles\n```\n\n## Usage Examples\n\n```python\n# Find neighbors of tile (21, 13)\nneighbors = get_neighbors(21, 13)\n# For odd row: [(22,13), (22,12), (21,12), (20,13), (21,14), (22,14)]\n\n# Calculate distance\ndist = hex_distance(21, 13, 24, 13)  # Returns 3\n\n# Check adjacency\nis_adj = hex_distance(21, 13, 21, 14) == 1  # True\n\n# Get all tiles within 3 of city center\nworkable = get_tiles_in_range(21, 13, 3)\n```\n\n## Key Insight: Even vs Odd Row\n\nThe critical difference is in directions 1, 2, 4, 5 (the diagonal directions):\n\n| Direction | Even Row (y%2==0) | Odd Row (y%2==1) |\n|-----------|-------------------|------------------|\n| NE (1) | (0, -1) | (1, -1) |\n| NW (2) | (-1, -1) | (0, -1) |\n| SW (4) | (-1, +1) | (0, +1) |\n| SE (5) | (0, +1) | (1, +1) |\n\nEast (0) and West (3) are always (1, 0) and (-1, 0).\n",{"name":5,"description":7},"main","7eeb258ada72b7f58119b0e7a2c00ea89d9beedd","tasks\u002Fciv6-adjacency-optimizer\u002Fenvironment\u002Fskills\u002Fhex-grid-spatial","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench","https:\u002F\u002Fgithub.com\u002FWaaaalnut","student of Zhejiang University","2026-04-21 23:16:23",{"source":8,"skillName":5,"commands":45,"prompt":55,"zipAvailable":56},[46,49,52],{"tool":47,"command":48},"npx","npx skills add Waaaalnut\u002Fskillsbench --skill hex-grid-spatial",{"tool":50,"command":51},"bunx","bunx skills add Waaaalnut\u002Fskillsbench --skill hex-grid-spatial",{"tool":53,"command":54},"pnpm","pnpm dlx skills add Waaaalnut\u002Fskillsbench --skill hex-grid-spatial","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fciv6-adjacency-optimizer\u002Fenvironment\u002Fskills\u002Fhex-grid-spatial\u002FSKILL.md",true,[58],{"path":59,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":62,"sourceHtmlUrl":63},"scripts\u002Fhex_utils.py","SCRIPT","脚本",4570,"https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fciv6-adjacency-optimizer\u002Fenvironment\u002Fskills\u002Fhex-grid-spatial\u002Fscripts\u002Fhex_utils.py",[65,79,94,120,142,160],{"skillNo":66,"name":67,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":68,"categories":69,"keywords":75,"publishedAt":32},"01M6XEWMJ6VY3ZC53MPDCPG3GH","data-reconciliation","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fxlsx-recover-data\u002Fenvironment\u002Fskills\u002Fdata-reconciliation\u002FSKILL.md",[70],{"categoryNo":71,"categoryName":72,"taxonomyType":73,"taxonomyTypeDesc":74},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[76,77,78],"data reconciliation","reconciliation","data",{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":85,"publishedAt":32},"01M6XEW8MNPMF1KRXV6ATGFRQF","speech-to-text","Transcribe video to timestamped text using Whisper tiny model (pre-installed).","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-tutorial-indexer\u002Fenvironment\u002Fskills\u002Fspeech-to-text\u002FSKILL.md",[],[86,87,88,89,90,91,92,93],"speech","text","speech to text","transcribe video","whisper","model","Video","transcribe",{"skillNo":95,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":105,"publishedAt":32},"01M6XEW3FQZP0T1RKQQJFXVY9T","video-processor","Process videos by removing segments and concatenating remaining parts. Use when you need to remove detected pauses\u002Fopenings from videos, create highlight reels, or batch process segment removals using ffmpeg filter_complex.","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Fvideo-processor\u002FSKILL.md",[100],{"categoryNo":101,"categoryName":102,"taxonomyType":103,"taxonomyTypeDesc":104},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[92,106,107,108,109,110,31,111,112,113,114,115,116,117,118,22,119],"processor","video processor","batch","create","reels","parts","segments","process","videos","you","segment","filter","ffmpeg","remove",{"skillNo":121,"name":122,"nameZh":6,"description":123,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":124,"categories":125,"keywords":127,"publishedAt":32},"01M6XEVXJ5KZ0NTY3XZKRY4AS1","silence-detector","Detect initial silence segments in audio\u002Fvideo using energy-based analysis. Use when you need to find low-energy periods at the start of recordings (title slides, setup time, pre-roll silence).","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Fsilence-detector\u002FSKILL.md",[126],{"categoryNo":101,"categoryName":102,"taxonomyType":103,"taxonomyTypeDesc":104},[128,129,130,131,31,115,132,133,134,135,136,112,137,138,92,139,140,141,22],"detector","silence detector","title","slides","time","energy","at","recordings","detect","find","Audio","analysis","start","setup",{"skillNo":143,"name":144,"nameZh":6,"description":145,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":146,"categories":147,"keywords":148,"publishedAt":32},"01M6XEVT3NGRN1FT7JPMAPXS6M","segment-combiner","Combine multiple segment detection results into a unified list. Use when you need to merge segments from different detectors, prepare removal lists for video processing, or consolidate detection outputs.","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Fsegment-combiner\u002FSKILL.md",[],[116,149,92,150,151,152,153,29,31,154,155,112,115,156,157,22,158,159],"segment combiner","detection","prepare","merge","video processing","outputs","combine","processing","consolidate","results","list",{"skillNo":161,"name":162,"nameZh":6,"description":163,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":164,"categories":165,"keywords":169,"publishedAt":32},"01M6XEVMPVASGS2KX86QK4FMT7","report-generator","Generate compression reports for video processing. Use when you need to create structured JSON reports with duration statistics, compression ratios, and segment details after video processing.","https:\u002F\u002Fgithub.com\u002FWaaaalnut\u002Fskillsbench\u002Fblob\u002Fmain\u002Ftasks\u002Fvideo-silence-remover\u002Fenvironment\u002Fskills\u002Freport-generator\u002FSKILL.md",[166],{"categoryNo":167,"categoryName":168,"taxonomyType":73,"taxonomyTypeDesc":74},"01JBSEEDCAT000000000000034","行政与办公人员",[170,171,172,116,31,29,115,28,156,173,174,175,22,153,176,92,177,178,109],"generator","report generator","report","statistics","structured","reports","json","compression","generate"]